飞行员配对方案问题 2011-12-29

算法实现题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.

 

posted on 2016-03-02 20:23  Yesphet  阅读(351)  评论(0编辑  收藏  举报