飞行员配对方案问题 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.
时间: 2024-12-05 04:41:46

飞行员配对方案问题 2011-12-29的相关文章

【 网络流24 】飞行员配对方案问题

第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的 2 名飞行员,其中 1 名是英国飞行员,另 1 名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员

P2756 飞行员配对方案问题

题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找

[FZYZOJ 1354] 8-1 飞行员配对方案问题

P1354 -- 8-1 飞行员配对方案问题 时间限制:1000MS      内存限制:131072KB      通过/提交人数:38/90 状态:Accepted      标签:    图论-网络流   图论-二分图   无 Description 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1 名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英

网络流24题第一题(luogu2796飞行员配对方案)

飞行员配对方案 二分图裸题,可以拿最大流怼. 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于

【二分图匹配/匈牙利算法】飞行员配对方案问题

P2756 飞行员配对方案问题 确认过眼神, 是二分图匹配板子题啦!!! 跑个匈牙利, 有匹配的输出, 记得先输出外籍飞行员, 因为有spj顺序无所谓啦qwq 最近A的最顺利的题了哈哈哈哈哈哈开心!!!!!!!! 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const int sz = 100010; 6 int n, m, num = 0, a

LuoguP2756 飞行员配对方案问题(最大流)

题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找

飞行员配对方案问题

题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合 的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次 派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编

洛谷 P2756 飞行员配对方案问题

题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找

luogu P2756 飞行员配对方案问题

二次联通门 : luogu P2756 飞行员配对方案问题 /* luogu P2756 飞行员配对方案问题 二分图匹配 输出时略麻烦 从源点开始 若扫到的下一条边的流量为0 则证明该条边可以 再枚举当前点的边,记录答案 最后输出即可 */ #include <iostream> #include <cstring> #include <cstdio> #include <queue> #define Max 202 #define INF 1e7 usin