来源:http://acm.hdu.edu.cn/showproblem.php?pid=2063
题意:
有k个组合a,b组合,代表a愿意与b坐过山车,共m个女生 n个男生,问有多少个满意的匹配
题解:
这是一道匈牙利算法的裸题,用递归询问是否能安排好某个女生,如果能就ans++
注意,在同一回合的询问中,某个女生只寻找一次其它男生,第二次寻找时一定无法找到,直接返回0就行
这是我第二次做这道题,在前几个月已经做过,没想到这就是传说中的二分图 Orz
#include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn = 500+5; int part[maxn]; bool vi[maxn]; int n,m,k; vector<int>ma[maxn]; bool is_ok(int x) { if(vi[x]==0)vi[x]=1; else return 0; for(int i=0;i<ma[x].size();i++) { if(part[ma[x][i]]==0||is_ok(part[ma[x][i]])) { part[ma[x][i]]=x; return 1; } } return 0; } int main() { while(scanf("%d",&k)!=EOF) { if(k==0)break; scanf("%d %d",&m,&n); int ans=0; for(int i=1;i<maxn;i++) { ma[i].clear(); part[i]=0; } for(int i=1;i<=k;i++) { int a,b; scanf("%d %d",&a,&b); ma[a].push_back(b); } for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++)vi[j]=0; if(is_ok(i)) ans++; } printf("%d ",ans); } return 0; }