題目背景
第二次世界大戰時期..
題目描述
英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在衆多的飛行員中,每一名外籍飛行員都可以與其他若干名英國飛行員很好地配合。如何選擇配對飛行的飛行員才能使一次派出最多的飛機。對於給定的外籍飛行員與英國飛行員的配合情況,試設計一個算法找出最佳飛行員配對方案,使皇家空軍一次能派出最多的飛機。
對於給定的外籍飛行員與英國飛行員的配合情況,編程找出一個最佳飛行員配對方案,使皇家空軍一次能派出最多的飛機。
輸入格式
第 1 行有 2 個正整數 m 和 n。n 是皇家空軍的飛行員總數(n<100);m 是外籍飛行員數(m<=n)。外籍飛行員編號爲 1~m;英國飛行員編號爲 m+1~n。
接下來每行有 2 個正整數 i 和 j,表示外籍飛行員 i 可以和英國飛行員 j 配合。最後以 2個-1 結束。
輸出格式
第 1 行是最佳飛行員配對方案一次能派出的最多的飛機數 M。接下來 M 行是最佳飛行員配對方案。每行有 2個正整數 i 和 j,表示在最佳飛行員配對方案中,飛行員 i 和飛行員 j 配對。如果所求的最佳飛行員配對方案不存在,則輸出‘No Solution!’。
輸入輸出樣例
輸入 #1複製
5 10 1 7 1 8 2 6 2 9 2 10 3 7 3 8 4 7 4 8 5 10 -1 -1
輸出 #1複製
4 1 7 2 9 3 8 5 10 震驚網絡流的24題竟然被我的匈牙利水過去了
這題就是二分圖輸出路徑板子
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
int line[maxn][maxn],used[maxn],nxt[maxn];
int n,m;
bool find(int x)
{
for(int i = m+1;i <= n;++i)
{
if(line[x][i] && !used[i])
{
used[i] = 1;
if(nxt[i] == 0 || find(nxt[i]))//如果這個人沒匹配或這個人可以和別人匹配就讓匹配
{
nxt[i] = x;
return true;
}
}
}
return false;
}//查詢匹配的人
int match()
{
int sum = 0;
for(int i = 1;i <= m;++i)
{
memset(used,0,sizeof(used));
if(find(i))
{
sum++;
}
}
return sum;
}//找匹配個數
int main()
{
scanf("%d%d", &m, &n);
while(1)
{
int x, y;
scanf("%d%d", &x, &y);
if(x == -1 && y == -1)
{
break;
}
line[x][y] = 1;
}
int d = match();
if(d)
{
printf("%d\n", d);
for(int i = m+1;i <= n;++i)
{
if(nxt[i])
{
printf("%d %d\n", nxt[i], i);//判斷是否是匹配的值即可
}
}
}
else{
printf("No Solution!\n");
}
return 0;
}