P2756 飞行员配对方案问题
2018-06-17 22:04:31来源:未知 阅读 ()
题目背景
第二次世界大战时期..
题目描述
英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。
对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。
输入输出格式
输入格式:
第 1 行有 2 个正整数 m 和 n。n 是皇家空军的飞行员总数(n<100);m 是外籍飞行员数(m<=n)。外籍飞行员编号为 1~m;英国飞行员编号为 m+1~n。
接下来每行有 2 个正整数 i 和 j,表示外籍飞行员 i 可以和英国飞行员 j 配合。最后以 2个-1 结束。
输出格式:
第 1 行是最佳飞行员配对方案一次能派出的最多的飞机数 M。接下来 M 行是最佳飞行员配对方案。每行有 2个正整数 i 和 j,表示在最佳飞行员配对方案中,飞行员 i 和飞行员 j 配对。如果所求的最佳飞行员配对方案不存在,则输出‘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
4 1 7 2 9 3 8 5 10
设置一个超级源点s,一个超级汇点t,
从s到1-m连一条流量为1的变。从m+1+n到t连一条流量为1的边。
然后对于s和t中的集合,连一条INF的边
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 const int MAXN=200001; 8 const int INF = 1e8; 9 inline void read(int &n) 10 { 11 char c='+';int x=0;bool flag=0; 12 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} 13 while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();} 14 n=flag==1?-x:x; 15 } 16 int n,m,s,t; 17 struct node 18 { 19 int u,v,flow,nxt; 20 }edge[MAXN]; 21 int head[MAXN]; 22 int cur[MAXN]; 23 int num=0; 24 int deep[MAXN]; 25 int tot=0; 26 void add_edge(int x,int y,int z) 27 { 28 edge[num].u=x;edge[num].v=y; 29 edge[num].flow=z;edge[num].nxt=head[x]; 30 head[x]=num++; 31 } 32 void add(int x,int y,int z) 33 { 34 add_edge(x,y,z); add_edge(y,x,0); 35 } 36 bool BFS() 37 { 38 memset(deep,0,sizeof(deep)); 39 deep[s]=1; queue<int>q; q.push(s); 40 while(q.size()!=0) 41 { 42 int p=q.front(); q.pop(); 43 for(int i=head[p];i!=-1;i=edge[i].nxt) 44 if(!deep[edge[i].v]&&edge[i].flow) 45 deep[edge[i].v]=deep[edge[i].u]+1, q.push(edge[i].v); 46 } 47 return deep[t]; 48 49 } 50 int DFS(int now,int nowflow) 51 { 52 if(now==t||nowflow<=0) return nowflow; 53 int totflow=0; 54 for(int &i=cur[now];i!=-1;i=edge[i].nxt) 55 { 56 if(deep[edge[i].v]==deep[edge[i].u]+1&&edge[i].flow) 57 {int canflow=DFS(edge[i].v,min(nowflow,edge[i].flow)); 58 edge[i].flow-=canflow;edge[i^1].flow+=canflow; 59 totflow+=canflow;nowflow-=canflow; 60 if(nowflow<=0) break;} 61 } 62 return totflow; 63 } 64 void Dinic() 65 { 66 int ans=0; 67 while(BFS()){memcpy(cur,head,MAXN);ans+=DFS(s,1e8);} 68 printf("%d\n",ans); 69 } 70 int vis[101]; 71 int main() 72 { 73 memset(head,-1,sizeof(head)); 74 int n,m; 75 read(m);read(n); 76 s=0;t=n+1; 77 for(int i=1;i<=m;i++) 78 add(s,i,1); 79 for(int i=m+1;i<=n;i++) 80 add(i,t,1); 81 int x,y; 82 while(scanf("%d%d",&x,&y)) 83 { 84 if(x==-1&&y==-1)break; 85 add(x,y,INF); 86 } 87 Dinic(); 88 for(int i=0;i<=num-1;i=i+2) 89 if(edge[i].v!=s&&edge[i].v!=t&&edge[i^1].v!=s&&edge[i^1].v!=t&&edge[i^1].flow) 90 printf("%d %d\n",edge[i].v,edge[i^1].v); 91 return 0; 92 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:P1151 子数整数
- 用循环队列解决舞伴配对问题发现自己的问题 2019-11-08
- 洛谷 P2756 飞行员配对方案问题 2018-09-01
- 07:配对碱基链 2018-06-17
- BZOJ4514: [Sdoi2016]数字配对(费用流) 2018-06-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash