先贴题面

14. [网络流24题] 搭配飞行员

★★☆   输入文件:flyer.in   输出文件:flyer.out简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】
    飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员。由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多。
如图,假设有10个驾驶员,如图中的V1,V2,…,V10就代表达10个驾驶员,其中V1,V2,V3,V4,V5是正驾驶员,V6,V7,V8,V9,V10是副驾驶员。如果一个正驾驶员和一个副驾驶员可以同机飞行,就在代表他们两个之间连一条线,两个人不能同机飞行,就不连。例如V1和V7可以同机飞行,而V1和V8就不行。请搭配飞行员,使出航的飞机最多。注意:因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行.
【输入格式】
输入文件有若干行
第一行,两个整数n与n1,表示共有n个飞行员(2<=n<=100),其中有n1名飞行员是正驾驶员.
下面有若干行,每行有2个数字a,b。表示正驾驶员a和副驾驶员b可以同机飞行。
注:正驾驶员的编号在前,即正驾驶员的编号小于副驾驶员的编号.
【输出格式】
输出文件有一行
第一行,1个整数,表示最大起飞的飞机数。
【输入输出样例】
输入文件名: flyer.in
10 5 
1 7 
2 6 
2 10 
3 7 
4 8 
5 9 
输出文件名:flyer.out
4
讲真确实是水题w简单的二分图最大匹配,可以转化为网络流来做.
首先建立超级源点$s$和$t$(编号$0$和$v+1$),从超级源点向所有正飞行员连一条容量为1的边,然后对于所有可能的匹配连一条从正飞行员到副飞行员的边,最后将所有副飞行员连接到超级汇点再跑一遍最大流就得了...
过于蒟蒻的我居然脑抽一开始觉得超级源点和超级汇点要连容量为INF的边...
好了代码时间
  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <iostream>
  6. #include <algorithm>
  7.  
  8. const int MAXE=;
  9. const int MAXV=;
  10. const int INF=0x7FFFFFFF;
  11.  
  12. struct Edge{
  13. int from;
  14. int to;
  15. int flow;
  16. Edge* rev;
  17. Edge* next;
  18. };
  19. Edge E[MAXE];
  20. Edge* head[MAXV];
  21. Edge* top=E;
  22.  
  23. int v,n;
  24. int depth[MAXV];
  25.  
  26. bool BFS(int,int);
  27. int Dinic(int,int);
  28. int DFS(int,int,int);
  29. void Insert(int,int,int);
  30.  
  31. int main(){
  32. freopen("flyer.in","r",stdin);
  33. freopen("flyer.out","w",stdout);
  34. int a,b;
  35. scanf("%d%d",&v,&n);
  36. while(scanf("%d%d",&a,&b)==){
  37. Insert(a,b,);
  38. }
  39. for(int i=;i<=n;i++){
  40. Insert(,i,);
  41. }
  42. for(int i=n+;i<=v;i++){
  43. Insert(i,v+,);
  44. }
  45. printf("%d\n",Dinic(,v+));
  46. return ;
  47. }
  48.  
  49. int Dinic(int s,int t){
  50. int ans=;
  51. while(BFS(s,t)){
  52. ans+=DFS(s,INF,t);
  53. }
  54. return ans;
  55. }
  56.  
  57. inline void Insert(int a,int b,int f){
  58. top->from=a;
  59. top->to=b;
  60. top->flow=f;
  61. top->rev=top+;
  62. top->next=head[a];
  63. head[a]=top;
  64. top++;
  65. top->from=b;
  66. top->to=a;
  67. top->flow=;
  68. top->rev=top-;
  69. top->next=head[b];
  70. head[b]=top;
  71. top++;
  72. }
  73.  
  74. bool BFS(int s,int t){
  75. std::queue<int> q;
  76. memset(depth,,sizeof(depth));
  77. depth[s]=;
  78. q.push(s);
  79. while(!q.empty()){
  80. int top=q.front();
  81. q.pop();
  82. for(Edge* i=head[top];i!=NULL;i=i->next){
  83. if(depth[i->to]==&&i->flow!=){
  84. q.push(i->to);
  85. depth[i->to]=depth[top]+;
  86. if(i->to==t)
  87. return true;
  88. }
  89. }
  90. }
  91. return false;
  92. }
  93.  
  94. int DFS(int root,int flow,int t){
  95. if(root==t||flow==)
  96. return flow;
  97. int tmp=flow;
  98. int k;
  99. for(Edge* i=head[root];i!=NULL;i=i->next){
  100. if(i->flow!=&&tmp!=&&depth[i->to]==depth[root]+){
  101. k=DFS(i->to,std::min(tmp,i->flow),t);
  102. if(k==){
  103. depth[i->to]=;
  104. continue;
  105. }
  106. i->flow-=k;
  107. i->rev->flow+=k;
  108. tmp-=k;
  109. if(tmp==)
  110. break;
  111. }
  112. }
  113. return flow-tmp;
  114. }

Backup

以及图包w

[COGS 0014][网络流24题] 搭配飞行员的更多相关文章

  1. Cogs 14. [网络流24题] 搭配飞行员(二分图匹配)

    [网络流24题] 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有若干个来自各地的驾驶员,专门 ...

  2. cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法

    14. [网络流24题] 搭配飞行员 ★★   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队有 ...

  3. Cogs 14. [网络流24题] 搭配飞行员

    这道题其实蛮好想的,因为分为正,副飞行员.所以就把正飞行员当作Boy,副飞行员当作Girl.然后做Hungry即可. #include<bits/stdc++.h> using names ...

  4. COGS——C 14. [网络流24题] 搭配飞行员

    http://cogs.pro/cogs/problem/problem.php?pid=14 ★★☆   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s  ...

  5. [网络流24题] 搭配飞行员(cogs 14)

    [问题描述]     飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞 ...

  6. COGS14. [网络流24题] 搭配飞行员

    [问题描述]     飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞 ...

  7. 【COGS 14】 [网络流24题] 搭配飞行员 网络流板子题

    用网络流水二分图的模型(存一下板子) #include <cstdio> #include <cstring> #include <algorithm> #defi ...

  8. 网络流24题 搭配飞行员(DCOJ8000)

    题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭 ...

  9. [网络流 24 题] luoguP2756 飞行员配对方案问题

    [返回网络流 24 题索引] 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的 222 名飞行员,其中 111 名是英国飞行员,另 ...

随机推荐

  1. POJ 1207 3N+1 Problem

    更简单的水题,穷举法即可. 需要注意的点: 1.i 和 j的大小关系不确定,即有可能 i>j 2.即使i>j,最后输出的结果也要严格按照输出,亦即如果输入10,1,则对应输出也应为 10 ...

  2. HTTP协议 URL

    http(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的We ...

  3. w3c编程挑战-初级脚本算法

    之前偶然看到了w3c上的编程挑战题,就像拿来试试手,先做的是初级脚本算法,总体不难,如果有更好的方法,希望能一起交流! 1.翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序 ...

  4. 纯CSS3美化单选按钮radio

    这种纯CSS3美化单选按钮radio的方法适用于以下情况: 1.可兼容IE9以上,需要兼容IE8的要写IE的hack把样式去掉 2.只支持单选按钮radio,因为单选按钮选中样式的圆圈可以用CSS做出 ...

  5. printf和scanf整理(后续填补)

    scanf和printf头文件:<stdio.h> 1.%d.%3d.%03d.%-3d区分 %d:以十进制形式输出整数(int) %3d:指定宽度为3,不足的左边补空格 %03d:一种左 ...

  6. 前端程序员的蜕变——JS的 event 对象属性、使用实例、兼容性处理(极大提高代码效率、减少代码量)

    下面讨论一下 js 中的 Event 对象,主要从以下三个方面详细的描述(点击标题可跳转到对应部分): 1.什么是event 2.怎么用event,用他该注意什么,几个简单实际应用 3.event在不 ...

  7. Java数值避免浮点型计算丢失精度问题

    问题描述及方案 假设我们在做电商项目,在进行计算时这个丢失精度在产品价格计算就会出现问题,很有可能造成我们手里有9.99元然后后面会有一堆9,但是呢这些钱无法购买一个10元的商品. 在某些编程语言中有 ...

  8. 记一次linux主机名莫名其妙变成了bogon

    起因:公司网络接口做了接口认证,虚拟机桥接至物理网卡无法完成认证进行网络访问,无奈之下只能讲虚拟机网络模式更改为NAT模式,更改完成之后进行ssh登录,发现主机名发生了变化. 更改NAT模式之前 [r ...

  9. eclipse 和 jdk的位数不同

    如果eclipse 和 jdk的位数不同,如一个64Bit一个32位,不需要修改环境变量,只需要在eclipse根目录的eclipse.ini文件中第一行加入:-vmD:\Program Files\ ...

  10. vue 基础-->进阶 教程(2): 指令、组件

    第二章 建议学习时间4小时  课程共3章 前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零 ...