[网络流 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 ...
随机推荐
- JDK13,不如温习下Java8
JDK13于9月17号正式GA,版本新特性可参考: https://www.oschina.net/news/109934/jdk-13-released 虽然JDK更新迅速,但开发者貌似并不买账,据 ...
- .Net轻量状态机Stateless
很多业务系统开发中,不可避免的会出现状态变化,通常采用的情形可能是使用工作流去完成,但是对于简单场景下,用工作流有点大财小用感觉,比如订单业务中,订单状态的变更,涉及到的状态量不是很多,即使通过简单的 ...
- Java 集合转换(数组、List、Set、Map相互转换)
package com.example.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Hash ...
- 苹果系统IOS第三方管理工具——imazing 优秀
iMazing 是一款 Windows.macOS 平台的 iPhone.iPad 管理工具,可以进行文件.音乐.视频传输,备份与还原数据,并且可以管理已安装应用,比如重新安装那些已下架的应用,是「史 ...
- StackOverflow 第四周周报及19年就业情况分析
这是 Stack Overflow 第四周周报,两篇 Java.两篇 Python.公众号「渡码」为日更,欢迎关注.另外,我搜集了今年的就业数据,对招聘情况和岗位情况做了简单总结,想了解的朋友点这里. ...
- java自学小段 产生随机数
public class Suijishu { public static void main(String[] args) { double i=Math.random();//产生一个0-0.5的 ...
- selenium自动化测试-浏览器基本操作
webdriver 通过协议和接口发现DOM中的元素,并实现控制浏览器的行为,例如打开浏览器.控制浏览器大小. 浏览器刷新及浏览器前进.后退等,接下来介绍浏览器的一些基本操作. 1.启动浏览器 dri ...
- .net core 3.0 Signalr - 03 使用MessagePack压缩传输内容
## MessagePack基础介绍 Signalr默认使用的是json形式传递数据,但是signalr提供了灵活的扩展,支持MessagePack形式序列化数据,以增加性能降低网络传输的效果,极大的 ...
- java基础之和String相关的一些转换
String虽然不是java的基本数据类型,但使用的频率却非常之高,可以说是很常见了. 列举几个常见的关于String的转换,写的有点过于简洁,欢迎纠错和补充 1.Object和String的 ...
- SUSE CaaS Platform 4 - Ceph RBD 作为 Pod 存储卷
RBD存储卷 目前 CaaSP4 支持多种 Volume 类型,这里选择 Ceph RBD(Rados Block Device),主要有如下好处: Ceph 经过多年开发,已经非常熟,社区也很活跃: ...