这是一道二分图最大匹配的模板题目。 使用算法:匈牙利算法
匈牙利算法的大致思路: 不断地进行匹配,如果当前匹配不可行,则尝试修改原来的匹配,使得最后的匹配数最大。
更加具体的内容推荐一个Blog http://blog.csdn.net/thundermrbird/article/details/52231639
最后直接上代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define MAX 1000 bool vis[MAX]; int match[MAX]; bool Link[MAX][MAX]; int v,k,n,m,u,ans=0; bool DFS(int x) { for(int i=1;i<=n;++i) { if(Link[x][i]&&!vis[i])//没有被访问过 { vis[i]=true; if(match[i]==0||DFS(match[i]))//如果没有匹配或者能够更改匹配 { match[i]=x;//当前x和v匹配 return true;//返回可以更改匹配 } } } return false;//无法更改匹配 } int main() { while(true) { memset(Link,0,sizeof(Link)); memset(match,0,sizeof(match)); ans=0; cin>>k; if(k==0)break; cin>>m>>n; for(int i=1;i<=k;++i) { cin>>u>>v; Link[u][v]=true; } for(int i=1;i<=m;++i) { memset(vis,0,sizeof(vis)); if(DFS(i))++ans; } cout<<ans<<endl; } return 0; }