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


  • 相关阅读:
    Codeforces 1485C Floor and Mod (枚举)
    CodeForces 1195D Submarine in the Rybinsk Sea (算贡献)
    CodeForces 1195C Basketball Exercise (线性DP)
    2021年初寒假训练第24场 B. 庆功会(搜索)
    任务分配(dp)
    开发工具的异常现象
    Telink MESH SDK 如何使用PWM
    Telink BLE MESH PWM波的小结
    [LeetCode] 1586. Binary Search Tree Iterator II
    [LeetCode] 1288. Remove Covered Intervals
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256744.html
Copyright © 2011-2022 走看看