题目链接: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); }