• 二分图最大匹配模板


    双向图模板:

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


  • 相关阅读:
    Java synchronized详解
    How to Use Lambda Expressions in a Query
    生活工作记录
    SilverLight中的几何形状 (转)
    用CSS改变鼠标样式
    SCRUM 敏捷开发 基础及失败成功案例分析
    JavaScript Create GUID function
    数据结构排序
    JSON简介
    追逐所求,享受所有
  • 原文地址:https://www.cnblogs.com/mingrigongchang/p/6246219.html
Copyright © 2020-2023  润新知