HDU2063(匈牙利算法)
不断寻找增广路,每找到一条增广路,匹配数加1
#include <cstdio> #include <cstring> #include <vector> using namespace std; int m,bn,gn; vector<int> vec[510]; bool b[510]; //记录v2的点是否被访问过 int lk[510]; //记录v2匹配的点 bool find(int cur) { for(vector<int>::iterator it=vec[cur].begin();it!=vec[cur].end();it++) { if(b[*it]) continue; b[*it]=1; if(!lk[*it]||find(lk[*it])) { lk[*it]=cur; return 1; } } return 0; } int main() { while(scanf(" %d",&m),m) { memset(lk,0,sizeof(lk)); scanf(" %d %d",&gn,&bn); for(int i=1;i<=gn;++i) vec[i].clear(); int bi,gi; for(int i=0;i<m;++i) { scanf(" %d %d",&gi,&bi); vec[gi].push_back(bi); } int ans=0; for(int i=1;i<=gn;++i) { memset(b,0,sizeof(b)); if(find(i)) ++ans; } printf("%d\n",ans); } }