这道题一看题目二分图的最大匹配,没见过的算法。翻了翻书,和最大流算法有关,好像很难的样子。但是这毕竟只是一道基础题,不用自己吓自己,不管算法自己认真的思考一定能想出来的。想的头都大了呀,于是乎偷偷看了看大神的博客。。。。真香!

具体思路是这样的:用递归思想,外国人和英国人配对,以外国人为主体给外国人安排。先给第一个外国人配一个英国人,再给第二个外国人配英国人,如果能跟第三个外国人配对的外国人已经没有了,就回溯到第一个外国人,重新给他分配别的英国人。。。。。。

语言表达始终有限,看代码应该好理解!

#include<iostream>
#include<cstring>
using namespace std;
int line[100][100];//外国人 i和英国人 j存在配对可能
int eman[100];//和英国人i配对的外国人的编号
int visit[100][100];//外国人 i和英国人 j已经配对
int n,m;
int find(int x)
{
int i;
for(i=1;i<=n;i++)
{
if(line[x][i]&&visit[x][i])
{
visit[x][i]=0;
if(eman[i]==0||find(eman[i]))
{
eman[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
memset(visit,1,sizeof(visit));
memset(eman,0,sizeof(eman));
memset(line,0,sizeof(line));
int i,sum=0;
cin>>m>>n;
int a,b;
while(cin>>a>>b,a!=-1&&b!=-1)
line[a][b]=1;
for(i=1;i<=m;i++)//给外国人找可以匹配的英国人
if(find(i)) sum++;
if(sum==0) cout<<"No Solution!"<<endl;
else cout<<sum;
}