算法实现题8-1 飞行员配对方案问题(习题 8-10)
´问题描述:
第二次世界大战时期, 英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出
的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员, 其中1 名是英国飞
行员,另1名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英
国飞行员很好地配合。 如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的
外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空
军一次能派出最多的飞机。
´编程任务:
对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,
使皇家空军一次能派出最多的飞机。
´数据输入:
由文件input.txt提供输入数据。文件第1 行有 2个正整数m和 n。n是皇家空军的飞行
员总数(n<100);m是外籍飞行员数。外籍飞行员编号为 1~m;英国飞行员编号为 m+1~n。
接下来每行有2个正整数i和j,表示外籍飞行员i可以和英国飞行员j配合。文件最后以 2
个-1 结束。
´结果输出:
程序运行结束时,将最佳飞行员配对方案输出到文件 output.txt 中。第 1 行是最佳飞行
员配对方案一次能派出的最多的飞机数 M。接下来 M 行是最佳飞行员配对方案。每行有 2
个正整数 i和j,表示在最佳飞行员配对方案中,飞行员i和飞行员j配对。
如果所求的最佳飞行员配对方案不存在,则输出‘No Solution!’ 。
输入文件示例
input.txt
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.txt
4
1 7
2 9
3 8
5 10
_____________________________________
网络最大流。建图:s到所有外籍飞行员建一条权值为1的有向边,所有外籍飞行员向每一个皇家飞行员建一条权值为1的边,所有皇家飞行员向t建一条权值为1的边
_____________________________________
1 Program stone; 2 var i,j,n,m,flow:longint; 3 map:array[0..101,0..101]of longint; 4 last:array[0..100]of longint; 5 vh,dis,di:array[0..101]of longint; 6 procedure init; 7 var i,j,k:longint; 8 begin 9 readln(m,n); 10 for i:=1 to m do map[0,i]:=1; 11 for i:=m+1 to n do map[i,n+1]:=1; 12 readln(j,k); 13 while j<>-1 do 14 begin 15 if j<=m then map[j,k]:=1 else map[k,j]:=1; 16 readln(j,k); 17 end; 18 end; 19 function min(a,b:longint):longint; 20 begin 21 if a<b then min:=a else min:=b; 22 end; 23 24 function aug(x,nf:longint):longint; 25 var l,i,d,minh,ins:longint; 26 begin 27 if x=n+1 then exit(nf); 28 l:=nf; 29 for i:=di[x] to n+1 do 30 if (map[x,i]>0)and(dis[i]+1=dis[x]) then 31 begin 32 di[x]:=i; 33 d:=aug(i,min(l,map[x,i])); 34 if (d>0)and(x<=m)and(x>0) then last[x]:=i; 35 dec(map[x,i],d); 36 inc(map[i,x],d); 37 dec(l,d); 38 if (dis[0]=n+2)or(l=0) then exit(nf-l); 39 end; 40 if l=nf then 41 begin 42 minh:=n+1; 43 for i:=0 to n+1 do 44 if (map[x,i]>0)and(dis[i]<minh) then begin minh:=dis[i];ins:=i;end; 45 di[x]:=ins; 46 dec(vh[dis[x]]); 47 if vh[dis[x]]=0 then dis[0]:=n+2; 48 dis[x]:=minh+1; 49 inc(vh[dis[x]]); 50 end; 51 exit(nf-l); 52 end; 53 Begin 54 assign(input,‘prog81.in‘);assign(output,‘prog81.out‘); 55 reset(input);rewrite(output); 56 init; 57 vh[0]:=n+2; 58 while dis[0]<n+2 do 59 inc(flow,aug(0,maxint)); 60 if flow=0 then write(‘No Solution!‘) 61 else begin 62 writeln(flow); 63 for i:=1 to m do 64 if last[i]>0 then 65 writeln(i,‘ ‘,last[i]); 66 end; 67 close(input);close(output); 68 end.