最大匹配

FZU 2039 Pets

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

其实说白了 这个算法用途有限 只能求二分图的最大匹配(如果没有任何扩展,毕竟我是鶸……

题目是一个人与狗的故事
这里每个人都想日狗 所以肯定是一对一的啊 但总共有 n个人 m只狗 e个先决条件
这些条件中 第ai个人不喜欢第bi只狗
问最多能让多少人 日到狗

AC Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <cmath>
#include <iostream>
#include <cstdlib>

using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1100;
int n,m,qnum;
int cus[maxn];
bool vis[maxn],g[maxn][maxn];

void init()
{
    memset(g,true,sizeof g);
    memset(cus,0,sizeof cus);
    int u,v;
    for(int i=0; i<qnum; i++)
    {
        scanf("%d%d",&u,&v);
        g[u][v]=false;
    }
}

bool fin(int a)
{
    for(int i=1; i<=m; i++)
        if(g[a][i]&&!vis[i])
        {
            vis[i]=true;
            if(cus[i]==0||fin(cus[i]))
            {
                cus[i]=a;
                return true;
            }
        }
    return false;
}

int main()
{
    int test;
    scanf("%d",&test);
    for(int t=1; t<=test; t++)
    {
        scanf("%d%d%d",&n,&m,&qnum);
        init();
        int ans=0;
        for(int i=1; i<=n; i++)
        {
            memset(vis,false,sizeof vis);
            if(fin(i)) ans++;
        }
        printf("Case %d: %d\n",t,ans);
    }
    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注