匈牙利算法是由匈牙利数学家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;
}