HDU1150

来源:互联网 发布:idea java 代码模板 编辑:程序博客网 时间:2024/06/09 06:07
刚刚复习了匈牙利算法 ,本质就是通过寻找可增光路来寻找可匹配数,还有一个定理就是最小点覆盖数和最大匹配数在二分图中是相同的。
#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <cstdlib>#include <cstdio>#include <string>#include <vector>#include <queue>#include <cmath>#include <stack>#include <map>#include <cmath>#include <set>#include <climits>#define INF 0x7fffffff#define finc(i,a,b) for(i=a;i<=b;i++)#define fdec(i,a,b) for(i=a;i>=b;i--)using namespace std;int n,m,k;int ma[1050][1050];bool vis[1050];int girl[1050];bool judge(int n){int i,j;for(i=1;i<=m;i++){if(ma[n][i]&&!vis[i]){vis[i]=1;if(girl[i]==0||judge(girl[i])){girl[i]=n;return true;}}}return false;}int main(){int i,j,a,b,id;while(~scanf("%d",&n)&&n){    memset(vis,0,sizeof(vis));    memset(ma,0,sizeof(ma));    memset(girl,0,sizeof(girl));int ans=0;scanf("%d%d",&m,&k);for(i=1;i<=k;i++){scanf("%d%d%d",&id,&a,&b);ma[a][b]=1;}for(i=1;i<=n;i++){memset(vis,0,sizeof(vis));if(judge(i))ans++;}printf("%d\n",ans);}return 0;}


0 0