[网络流 24 题] luoguP2756 飞行员配对方案问题
题目描述
英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的 222 名飞行员,其中 111 名是英国飞行员,另 111 名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。
对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。
输入格式
第 111 行有 222 个正整数 mmm 和 nnn。nnn 是皇家空军的飞行员总数 (n<100)(n<100)(n<100);mmm 是外籍飞行员数 (m≤n)(m\leq n)(m≤n)。外籍飞行员编号为 1∼m1\sim m1∼m;英国飞行员编号为 m+1∼nm+1\sim nm+1∼n。
接下来每行有 222 个正整数 iii 和 jjj,表示外籍飞行员 iii 可以和英国飞行员 jjj 配合。最后以 222 个 −1-1−1 结束。
输出格式
第 111 行是最佳飞行员配对方案一次能派出的最多的飞机数 MMM。接下来 MMM 行是最佳飞行员配对方案。每行有 222 个正整数 iii 和 jjj,表示在最佳飞行员配对方案中,飞行员 iii 和飞行员 jjj 配对。如果所求的最佳飞行员配对方案不存在,则输出No Solution!
。
输入样例
5 10
1 7
1 8
2 6
2 9
2 10
3 7
3 8
4 7
4 8
5 10
-1 -1
输出样例(Special Judge)
4
1 7
2 9
3 8
5 10
Solution P2756\text{Solution P2756}Solution P2756
将英国飞行员放在左边一组,外籍飞行员放右边一组,完成建图。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define reg register
struct node{
int x,y,d,next,other;
}e[22000];
int len=0;
int n,m;
int first[210];
int h[210];
int q[1000010];
int st,ed;
int s1,s2;
const int ST=201,ED=202;
int mh[210];
void ins(int x,int y,int d){
e[++len].x=x;e[len].y=y;e[len].d=1;
e[len].next=first[x];first[x]=len;
e[++len].x=y;e[len].y=x;e[len].d=0;
e[len].next=first[y];first[y]=len;
e[len].other=len-1;
e[len-1].other=len;
}
bool bfs(){
memset(h,0,sizeof(h));h[ST]=1;
st=1;ed=2;q[st]=ST;
while(st!=ed){
int x=q[st];
for(reg int i=first[x];i;i=e[i].next){
int y=e[i].y;
if(!h[y]&&e[i].d){
h[y]=h[x]+1;
q[ed++]=y;
}
}
++st;
}
if(h[ED]>0) return 1;
return 0;
}
#define min(x,y) ((x)<(y)?(x):(y))
int dfs(int x,int f){
if(x==ED) return f;
int tt=0;
for(reg int i=first[x];i;i=e[i].next){
int y=e[i].y;
if(h[y]==h[x]+1&&e[i].d>0&&f>tt){
int my=dfs(y,min(f-tt,e[i].d));
e[i].d-=my;
e[e[i].other].d+=my;
tt+=my;
if(my&&x!=ST&&x!=ED&&y!=ST&&y!=ED)
mh[x]=y;
if(tt==f) return f;
}
}
if(!tt) h[x]=0;
return tt;
}
int main(){
scanf("%d%d",&m,&n);
do{
scanf("%d%d",&s1,&s2);
if(s1==-1&&s2==-1) break;
ins(s1,s2,1);
}while(s1!=-1||s2!=-1);
for(reg int i=1;i<=m;++i)
ins(ST,i,1);
for(reg int i=m+1;i<=n;++i)
ins(i,ED,1);
int ans=0;
while(bfs()) ans+=dfs(ST,0x3f3f3f3f);
if(!ans){
puts("No Solution!");
exit(0);
}
printf("%d\n",ans);
for(reg int i=1;i<=m;++i)
if(mh[i])
printf("%d %d\n",i,mh[i]);
}
[网络流 24 题] luoguP2756 飞行员配对方案问题的更多相关文章
- 【PowerOJ1736&网络流24题】飞行员配对方案问题(最小割)
题意: n<=100,要求输出方案 思路:准备把没刷的24题从头搞一遍 输出方案的话就在增广的时候记一下另一端的编号就好 #include<bits/stdc++.h> using ...
- [COGS 0014][网络流24题] 搭配飞行员
先贴题面 14. [网络流24题] 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out简单对比时间限制:1 s 内存限制:128 MB [问题描述] 飞行 ...
- Cogs 14. [网络流24题] 搭配飞行员(二分图匹配)
[网络流24题] 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有若干个来自各地的驾驶员,专门 ...
- cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法
14. [网络流24题] 搭配飞行员 ★★ 输入文件:flyer.in 输出文件:flyer.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有 ...
- 网络流24题第一题(luogu2796飞行员配对方案)
飞行员配对方案 二分图裸题,可以拿最大流怼. 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 ...
- Cogs 14. [网络流24题] 搭配飞行员
这道题其实蛮好想的,因为分为正,副飞行员.所以就把正飞行员当作Boy,副飞行员当作Girl.然后做Hungry即可. #include<bits/stdc++.h> using names ...
- LuoguP2756 飞行员配对方案问题(最大流)
题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外 ...
- COGS14. [网络流24题] 搭配飞行员
[问题描述] 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞 ...
- COGS——C 14. [网络流24题] 搭配飞行员
http://cogs.pro/cogs/problem/problem.php?pid=14 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比时间限制:1 s ...
随机推荐
- ubuntu httpie使用方法
HTTPie 是用 Python 写的,所以你可以在几乎所有地方(Linux,MacOSX,Windows)安装它.而且,在大多数的 Linux 发行版中都有编译好的安装包. Debian,Ubunt ...
- ubuntu连接window系统
最后可以通过次命令挂载本地文件夹到远程电脑: rdesktop -a 24 -f -r disk:share-name=/home/lion/.m2/ 192.168.151.232
- 大数据平台搭建 - cdh5.11.1 - spark源码编译及集群搭建
一.spark简介 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎,Spark 是一种与 hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同 ...
- .Net轻量状态机Stateless
很多业务系统开发中,不可避免的会出现状态变化,通常采用的情形可能是使用工作流去完成,但是对于简单场景下,用工作流有点大财小用感觉,比如订单业务中,订单状态的变更,涉及到的状态量不是很多,即使通过简单的 ...
- 002:CSS基础
注意:蓝色 重要:红色 目录: 1. 学会使用CSS选择器: 9大选择器.交集选择器.并集选择器.后代选择器.子代选择器.伪类选择器. 2.font.color.横向竖向居中.文本修饰.首行缩进. f ...
- 启动第二个activity,然后返回数据给第一个数据
第一个activity启动的代码: intent = new Intent(MainActivity.this, Main2Activity.class); startActivityForResul ...
- [Leetcode] 第334题 递增的三元子序列
一.题目描述 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1, ...
- [LeetCode]Unique Binary Search TreesII
题目:Unique Binary Search TreesII 如果要列出所有可能的二叉搜索树,可以在上面的思路上进一步. f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... ...
- Mybatis源码解析,一步一步从浅入深(一):创建准备工程
Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...
- python语言程序设计基础 习题 天天向上的力量(math.pow)
实例1: 一年365天,,以第一天的能力值为基数1.0,当好好学习时能力值相比前一天提高1%,没有学习时能力值相比前天要降低1%,每天努力和每天放任,一年下来的能力值相差多少? 解析: 如果每天都好好 ...