线性规划与网络流24题之飞行员配对计划 二分图的最大匹配
来源:互联网 发布:apache ant 1.9.4安装 编辑:程序博客网 时间:2024/04/29 19:51
http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=475
description
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1 名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。 对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。
input
多组数据输入.每组输入第1 行有2个正整数m和n。n是皇家空军的飞行员总数(n<100);m是外籍飞行员数。外籍飞行员编号为1~m;英国飞行员编号为m+1~n。接下来每行有2 个正整数i和j,表示外籍飞行员i可以和英国飞行员j配合。文件最后以2个-1 结束。
output
每组输出最佳飞行员配对方案一次能派出的最多的飞机数M。如果所求的最佳飞行员配对方案不存在,则输出‘No Solution!’。
sample_input
5 101 71 82 62 92 103 73 84 74 85 10-1 -1
sample_output
4二分图的最大匹配,增加一个源和一个汇,利用网络最大流模板解题。#include<cstdio>#include<iostream>using namespace std;const int oo=1e9;/**oo 表示无穷大*/const int mm=111111;/**mm 表示边的最大数量,记住要是原图的两倍,在加边的时候都是双向的*/const int mn=999;/**mn 表示点的最大数量*/int node,src,dest,edge;/**node 表示节点数,src 表示源点,dest 表示汇点,edge 统计边数*/int ver[mm],flow[mm],next[mm];/**ver 边指向的节点,flow 边的容量,next 链表的下一条边*/int head[mn],work[mn],dis[mn],q[mn];/**head 节点的链表头,work 用于算法中的临时链表头,dis 计算距离*//**初始化链表及图的信息*/void prepare(int _node,int _src,int _dest){ node=_node,src=_src,dest=_dest; for(int i=0; i<node; ++i)head[i]=-1; edge=0;}/**增加一条u 到v 容量为c 的边*/void addedge(int u,int v,int c){ ver[edge]=v,flow[edge]=c,next[edge]=head[u],head[u]=edge++; ver[edge]=u,flow[edge]=0,next[edge]=head[v],head[v]=edge++;}/**广搜计算出每个点与源点的最短距离,如果不能到达汇点说明算法结束*/bool Dinic_bfs(){ int i,u,v,l,r=0; for(i=0; i<node; ++i)dis[i]=-1; dis[q[r++]=src]=0; for(l=0; l<r; ++l) for(i=head[u=q[l]]; i>=0; i=next[i]) if(flow[i]&&dis[v=ver[i]]<0) { /**这条边必须有剩余容量*/ dis[q[r++]=v]=dis[u]+1; if(v==dest)return 1; } return 0;}/**寻找可行流的增广路算法,按节点的距离来找,加快速度*/int Dinic_dfs(int u,int exp){ if(u==dest)return exp; /**work 是临时链表头,这里用i 引用它,这样寻找过的边不再寻找*/ for(int &i=work[u],v,tmp; i>=0; i=next[i]) if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0) { flow[i]-=tmp; flow[i^1]+=tmp; /**正反向边容量改变*/ return tmp; } return 0;}int Dinic_flow(){ int i,ret=0,delta; while(Dinic_bfs()) { for(i=0; i<node; ++i)work[i]=head[i]; while(delta=Dinic_dfs(src,oo))ret+=delta; } return ret;}int main(){ int n,m,a,b; while(~scanf("%d%d",&m,&n)) { prepare(n+m+2,0,n+m+1); for(int i=1;i<=n;i++) { if(i<=m) addedge(src,i,1); else addedge(i,dest,1); } for(;;) { scanf("%d%d",&a,&b); if(a==-1&&b==-1) break; addedge(a,b,1); } int ans=Dinic_flow(); printf("%d\n",ans); } return 0;}
0 0
- 线性规划与网络流24题之飞行员配对计划 二分图的最大匹配
- P3386 【模板】二分图匹配(网络流与线性规划24题01飞行员配对方案问题)
- 线性规划与网络流24题の1 飞行员配对方案问题(最大匹配)
- [网络流24题] 飞行员配对方案问题 最大流 二分图最大匹配
- 【线性规划与网络流24题 1】飞行员配对方案
- 【线性规划与网络流24题 1】飞行员配对方案
- 线性规划与网络流24题 飞行员配对方案问题
- 【网络流/二分图匹配】飞行员配对
- 2006 飞行员配对(二分图最大匹配)
- 2006 飞行员配对(二分图最大匹配)
- 一、飞行员配对方案问题 [二分图的最大匹配]
- 飞行员配对方案问题(二分图的最大匹配)
- 线性规划与网络流24题之分配问题 最大费用最大流、最小费用最大流、二分图的最佳匹配
- 二分图匹配——Luogu2756 [网络流24题]飞行员配对方案问题
- [网络流24题] 飞行员配对方案问题 二分图/最大流
- 线性规划与网络流24题 01飞行员配对方案问题
- 线性规划与网络流24题——01飞行员配对方案问题
- 网络流与线性规划24题01飞行员配对方案问题
- c/c++调用MySql的存储过程
- iOS7官方推荐图标和图像尺寸
- libusb 打印ubs信息
- acdreamoj 瑶瑶饿了 完全背包
- mfxjtjejueshewrgwegtwegefagqgh呵呵人很好哇
- 线性规划与网络流24题之飞行员配对计划 二分图的最大匹配
- NYOJ-844 A+B Problem(V)
- leetcode:Populating Next Right Pointers in Each Node
- 如何查看oracle表空间已使用大小
- hdu 1753 大明A+B (正小数相加)
- 初衷
- gson对各种Java对象与json的转换的支持
- Object-C基本数据类型小结
- Scrapy在windows环境下的搭建