zoukankan      html  css  js  c++  java
  • 二分图最大匹配模板

    双向图模板:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    int e[101][101];
    int match[101];
    int book[101];
    int n,m;
    
    int dfs(int u)
    {
        int i;
        for(i=1;i<=n;i++)
        {
            if(book[i]==0&&e[u][i]==1)
            {
                book[i]=1; //标记点i已访问过
                if(match[i]==0||dfs(match[i]))
                {
                    //更新配对关系
                    match[i]=u;
                    match[u]=i;
                    return 1;//把dfs(u)置为true
                }
            }
        }
             return 0;
        }
    int main()
    {
       freopen("in.txt","r",stdin);
       int i,j,t1,t2,sum=0;
    
       scanf("%d%d",&n,&m);
    
       for(i=1;i<=m;i++){
        scanf("%d%d",&t1,&t2);
        e[t1][t2]=1;
        e[t2][t1]=1;  //无向图
       }
       for(i=1;i<=n;i++)
        match[i]=0;
    
       for(i=1;i<=n;i++){
        for(j=1;j<=n;j++)
            book[j]=0; //清空上次搜索时的标记
        if(dfs(i))
            sum++;     //寻找增广路,如果找到,配对数加1.
       }
       printf("%d",sum);
        return 0;
    }
    


    单向模板(POJ 1274牛和牛棚的匹配)

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int e[500][500];
    int match[500];
    int book[500];
    int n,m;
    
    int dfs(int u)
    {
        int i;
        for(i=1;i<=m;i++)
        {
            if(book[i]==0&&e[u][i]==1)
            {
                book[i]=1; //标记点i已访问过
                if(match[i]==0||dfs(match[i]))
                {
                    //更新配对关系
                    match[i]=u;//注意不是match[u]=i;
    
                    return 1;
                }
            }
        }
             return 0;
        }
    int main()
    {
       //freopen("in.txt","r",stdin);
       int i,j,t1,t2,sum=0;
       int k,a;
       while(scanf("%d%d",&n,&m)!=EOF){
         memset(e,0,sizeof(e));
         memset(book,0,sizeof(book));
         sum=0;
       for(i=1;i<=n;i++){
        scanf("%d",&k);
        for(j=1;j<=k;j++)
        {
            scanf("%d",&a);
        e[i][a]=1;
    
       }
       }
       for(i=1;i<=n;i++)
        match[i]=0;
    
       for(i=1;i<=n;i++){
        
        memset(book,0,sizeof(book)); //清空上次搜索时的标记
        if(dfs(i))
            sum++;     //寻找增广路,如果找到,配对数加1.
       }
       printf("%d
    ",sum);
       }
        return 0;
    }
    


  • 相关阅读:
    CentOS7下搭建hadoop2.7.3完全分布式
    在linux命令行利用SecureCRT上传下载文件
    SPDY和HTTP
    哈希表的工作原理
    LVS(Linux Virtual Server)
    Discuz x3 UCenter实现同步登陆原理
    Goroutine(协程)为何能处理大并发?
    缓存与DB数据一致性问题解决的几个思路
    固态硬盘SSD与闪存(Flash Memory)
    堆和栈的区别(转过无数次的文章)
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256744.html
Copyright © 2011-2022 走看看