1. 程式人生 > >51Nod2006 飛行員配對(遞迴)

51Nod2006 飛行員配對(遞迴)

這道題一看題目二分圖的最大匹配,沒見過的演算法。翻了翻書,和最大流演算法有關,好像很難的樣子。但是這畢竟只是一道基礎題,不用自己嚇自己,不管演算法自己認真的思考一定能想出來的。想的頭都大了呀,於是乎偷偷看了看大神的部落格。。。。真香!

具體思路是這樣的:用遞迴思想,外國人和英國人配對,以外國人為主體給外國人安排。先給第一個外國人配一個英國人,再給第二個外國人配英國人,如果能跟第三個外國人配對的外國人已經沒有了,就回溯到第一個外國人,重新給他分配別的英國人。。。。。。

語言表達始終有限,看程式碼應該好理解!

#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;
}