第二次世界大戰時期..
英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若干名英國飛行員很好地配合。如何選擇配對飛行的飛行員才能使一次派出最多的飛機。對於給定的外籍飛行員與英國飛行員的配合情況,試設計乙個演算法找出最佳飛行員配對方案,使皇家空軍一次能派出最多的飛機。
對於給定的外籍飛行員與英國飛行員的配合情況,程式設計找出乙個最佳飛行員配對方案,使皇家空軍一次能派出最多的飛機。
輸入格式:
第 1 行有 2 個正整數 m 和 n。n 是皇家空軍的飛行員總數(n<100);m 是外籍飛行員數。外籍飛行員編號為 1~m;英國飛行員編號為 m+1~n。
接下來每行有 2 個正整數 i 和 j,表示外籍飛行員 i 可以和英國飛行員 j 配合。最後以 2個-1 結束。
輸出格式:
第 1 行是最佳飛行員配對方案一次能派出的最多的飛機數 m。接下來 m 行是最佳飛行員配對方案。每行有 2個正整數 i 和 j,表示在最佳飛行員配對方案中,飛行員 i 和飛行員 j 配對。如果所求的最佳飛行員配對方案不存在,則輸出『no solution!』。
輸入樣例#1:
5 101 71 8
2 62 9
2 10
3 73 8
4 74 8
5 10
-1 -1
輸出樣例#1:
41 72 9
3 85 10
思路:網路流
**實現:
1 #include2 #include3int n,m,ans,cp[110];4
inta,b,c;
5int h[110
],hs;
6struct edgee[12100];7
int head,tail,d[110];8
struct queueq[110];9
int min(int x,int y)
10bool bfs(int s,int
t),d[s]=1;14
while(head>tail);
18 d[e[i].s]=b+1;19
if(e[i].s==t) return
true;20
}21}22
return
false;23
}24int ap(int k,int t,int
v)33}34
return
act;35}
36bool dinic(int s,int
t)40
intmain(),h[a]=hs;
45 e[++hs]=(edge),h[b]=hs;46}
47for(int i=1;i<=m;i++) e[++hs]=(edge),h[0]=hs;
48for(int i=m+1;i<=n;i++) e[++hs]=(edge),h[i]=hs;
49while(dinic(0,n+1
));50 printf("
%d\n
",ans);
51for(int i=1;i<=n;i++) if(cp[i]) printf("
%d %d\n
",i,cp[i]);
52return0;
53 }
乙個小發現,用網路流做二分圖匹配不需要給源點s和匯點t引出的邊建反邊,有心人可以嘗試證明一下。
另外,不要嘗試codevs上的,評測方法有坑,除非特定順序才行。
飛行員配對方案問題
題目描述 問題描述 第二次世界大戰時期,英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2名飛行員,其中1名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若干名英國飛行員很好地配合。如何選擇配對飛行的飛行員...
飛行員配對方案
題目大意 只要外籍飛行員與英籍飛行員匹配就可以駕駛一架飛機,共有n個飛行員,其中有m個外籍的,問最多有多少對匹配的飛行員 乙個外籍乙個英籍 解題思路 方法 網路流 最大流 匈牙利演算法 這裡用網路流 最大流 首先建乙個源點和乙個匯點,源點與外籍飛行員間建立一條有向邊 外籍飛行員方向 匯點與英籍飛行員...
網路流 飛行員配對方案問題
題目描述 第二次世界大戰時期,英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若干名英國飛行員很好地配合。如何選擇配對飛行的飛行員才能使...