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;
    }
    


  • 相关阅读:
    解决linux下打开windows下压缩文件乱码的问题
    vim & emacs 强制修改 root 权限的文件
    在ubuntu下,给 svn diff 一点颜色
    sql优化(一)
    sql优化(二) 索引(一)
    Java反射与思想!
    JDK5.0枚举 泛型 注释
    忘羡的Day9!
    来博客的第二天!
    来博客第一天
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256744.html
Copyright © 2011-2022 走看看