题目链接:http://poj.org/problem?id=3041
没看题,网上搜最大二分匹配搜到的
匈牙利算法,深搜一次最多增加一个匹配
代码:
#include <stdio.h> #include <stdlib.h> int tu[505][505]; int mx[505],my[505]; int flag[505]; short dfs(int n,int s) { int i; for(i=1;i<=n;i++) { if(tu[s][i]==1&&flag[i]==0) { flag[i]=1; if(my[i]==0) { my[i]=s; mx[s]=i; return 1; } else { if(dfs(n,my[i])==1) { my[i]=s; mx[s]=i; return 1; } } } } return 0; } int main(int argc, char** argv) { int n,m,i,a,b,sum,j; scanf("%d %d",&m,&n); memset(tu,0,sizeof(tu)); memset(mx,0,sizeof(mx)); memset(my,0,sizeof(my)); for(i=1;i<=n;i++) { scanf("%d %d",&a,&b); tu[a][b]=1; } sum=0; for(i=1;i<=m;i++) { memset(flag,0,sizeof(flag)); if(mx[i]==0) { sum+=dfs(m,i); } } printf("%d\n",sum); return (EXIT_SUCCESS); }