hdu1150
二分图最大匹配的模板体,套模板就过了,但是很坑爹有木有,那个i根本没有用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> bool map[501][501]; int mark[501]; bool flag[501]; int k,g,m; void get_map() { int i,x,y; for(i=0;i<k;i++) { int tt; scanf("%d%d%d",&tt, &x,&y); map[x][y]=1; } } bool dfs(int x) { int i; for(i=1;i<=m;i++) { if(!map[x][i]||flag[i]) continue; flag[i]=1; if(!mark[i]||dfs(mark[i]))//i点为孤立点,或者i不是孤立点时寻找i所对应的女生的增广路,如果那个女生能找到另一条增广路径 { mark[i]=x; //就可以使i变成孤立点,从而使增广路径的长度加1,此处的dfs(mark[i])就是找i对应的女生能否有另 return 1; //一条不包含i的增广路径,而mark[]是用来判断是否是孤立点的。 } } return 0; } void solve() { int i,count=0; memset(mark,0,sizeof(mark));//记录女孩i对应的男孩// for(i=1;i<=g;i++) { memset(flag,0,sizeof(flag));//标记是否被访问过// if(dfs(i)) { count++; } } printf("%d\n",count); } int main() { freopen("sbin.txt", "r", stdin); while(scanf("%d",&k)&&k!=0) { scanf("%d%d",&g,&m); memset(map,0,sizeof(map)); get_map(); solve(); } return 0; }