第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空 军一次能派出最多的飞机 。对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案, 使皇家空军一次能派出最多的飞机。
Input 第1行有2个正整数 m 和 n。n 是皇家空军的飞行 员总数(n<100);m 是外籍飞行员数。外籍飞行员编号为 1~m;英国飞行员编号为 m+1~n。接下来每行有 2 个正整数 i 和 j,表示外籍飞行员 i 可以和英国飞行员 j 配合。输入最后以 2 个-1 结束。 Output 第 1 行是最佳飞行 员配对方案一次能派出的最多的飞机数 M。如果所求的最佳飞行员配对方案不存在,则输出‘No Solution!’。 Input示例 5 10 1 7 1 8 2 6 2 9 2 10 3 7 3 8 4 7 4 8 5 10 -1 -1 Output示例 4换平台后的第一道题就不会,基础题,又学新知识了!
简单的二分图最大匹配。
#include<stdio.h> #include<string.h> using namespace std; int use[100];//记录是否已经遍历过 int mat[100][100];//记录两个飞行员是否配合 int lank[100];//记录匹配的值 int n,m; int dfs(int v){ int i; for(i=m+1;i<=n;i++){ if(mat[v][i]&&!use[i]){ use[i]=1; if(lank[i]==0||dfs(lank[i])){ lank[i]=v; return 1; } } } return 0; } int main() { int a,b,ans=0; memset(mat,0,sizeof(mat)); memset(lank,0,sizeof(lank)); scanf("%d%d",&m,&n); while(~scanf("%d%d",&a,&b)&&a!=-1&&b!=-1){ mat[a][b]=1; } for(int i=1;i<=m;i++){ memset(use,0,sizeof(use)); if(dfs(i)) ans++; } if(ans) printf("%d\n",ans); else printf("No Solution\n"); return 0; }