51Nod2006 飛行員配對(遞迴)
阿新 • • 發佈:2018-12-22
這道題一看題目二分圖的最大匹配,沒見過的演算法。翻了翻書,和最大流演算法有關,好像很難的樣子。但是這畢竟只是一道基礎題,不用自己嚇自己,不管演算法自己認真的思考一定能想出來的。想的頭都大了呀,於是乎偷偷看了看大神的部落格。。。。真香!
具體思路是這樣的:用遞迴思想,外國人和英國人配對,以外國人為主體給外國人安排。先給第一個外國人配一個英國人,再給第二個外國人配英國人,如果能跟第三個外國人配對的外國人已經沒有了,就回溯到第一個外國人,重新給他分配別的英國人。。。。。。
語言表達始終有限,看程式碼應該好理解!
#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; }