Codevs1232飞行员配对方案问题【二分图最大匹配】

Codevs上的Special Judge似乎挂了 所以就跑到COGS上交 http://cojs.tk/cogs/problem/problem.php?pid=14

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

裸二分图最大匹配 超级源S向正驾驶员连边 容量为1  副驾驶员向超级汇T连边 容量为1

对应的正驾驶员和副驾驶员连边容量为1 然后跑Dinic

#include<cstdio>
#define inf 214748263
#include<iostream>
#include<algorithm>
#include<queue>
#define N 500
#include<cstring>
using namespace std;
int dis[250],n,m,ans,tot=1,a,b,c,i,head[N],nn;
struct Edge{
    int to,next,w;
}e[N<<1];
inline void ins(int u,int v,int w){
     e[++tot].w=w; e[tot].to=v; e[tot].next=head[u]; head[u]=tot;
}
int bfs() {
       memset(dis,-1,sizeof(dis)); dis[1]=0; queue<int>q;
       q.push(1);
       while(!q.empty()) {
              int now=q.front(); q.pop();
              for(int k=head[now];k;k=e[k].next)
                if (dis[e[k].to]<0 && e[k].w>0) {
                      dis[e[k].to]=dis[now]+1; q.push(e[k].to);
                }
       }
       if (dis[m]>0) return 1; else return 0;
}
int find(int x,int low) {
    if(x==m)return low; int a;
    for(int k=head[x];k;k=e[k].next)
       if(e[k].w>0 && dis[e[k].to]==dis[x]+1 && (a=find(e[k].to,min(low,e[k].w))))
         {
             e[k].w-=a; e[k^1].w+=a; return a;
         }
     return 0;
}
int main () {
     freopen("flyer.in","r",stdin); freopen("flyer.out","w",stdout);
     scanf("%d%d",&nn,&n); nn-=n;  m=1+n+nn+1;
     for(i=1;i<=n;i++) ins(1,1+i,1),ins(i+1,1,0);
     for(i=1;i<=nn;i++) ins(1+n+i,m,1),ins(m,1+n+i,0);
     while(scanf("%d%d",&a,&b)!=EOF) {
           ++a; ++b;
          ins(a,b,1); ins(b,a,0);
     }
     while (bfs()) {
          while(tot=find(1,inf)) ans+=tot;
     }
     printf("%d",ans);fclose(stdin); fclose(stdout);
}

时间: 2024-11-07 19:38:17

Codevs1232飞行员配对方案问题【二分图最大匹配】的相关文章

P2756 飞行员配对方案问题[二分图最大匹配]

题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空

网络流24题-飞行员配对方案问题-二分图最大匹配

这道题,是个人都看得出来,是求一个二分图的最大匹配. 但是网络流24题嘛,我们考虑一下用网络流的方法做. 一般二分图的题,转网络流做,都需要建立一个起点和汇点.然后求一个最大流,这个最大流就是二分图的最大匹配. 我用的是Edmonds-Karp算法bfs版本 代码 #include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<queue>

P2756 飞行员配对方案问题 二分图匹配 匈牙利算法

题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找

luogu P2756 飞行员配对方案问题

二次联通门 : luogu P2756 飞行员配对方案问题 /* luogu P2756 飞行员配对方案问题 二分图匹配 输出时略麻烦 从源点开始 若扫到的下一条边的流量为0 则证明该条边可以 再枚举当前点的边,记录答案 最后输出即可 */ #include <iostream> #include <cstring> #include <cstdio> #include <queue> #define Max 202 #define INF 1e7 usin

dinic求解二分图最大匹配&amp;&amp;网络流24题之飞行员配对方案问题

在二分图的基础上增加源S和汇T.1.S向X集合中每个顶点连一条容量为1的有向边.2.Y集合中每个顶点向T连一条容量为1的有向边.3.XY集合之间的边都设为从A集合中的点到B集合之中的点,容量为1的有向边. 求网络最大流,流量就是匹配数,所有满流边是一组可行解. 所以就解决了. 飞行员配对方案问题: 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外

【二分图匹配/匈牙利算法】飞行员配对方案问题

P2756 飞行员配对方案问题 确认过眼神, 是二分图匹配板子题啦!!! 跑个匈牙利, 有匹配的输出, 记得先输出外籍飞行员, 因为有spj顺序无所谓啦qwq 最近A的最顺利的题了哈哈哈哈哈哈开心!!!!!!!! 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const int sz = 100010; 6 int n, m, num = 0, a

[FZYZOJ 1354] 8-1 飞行员配对方案问题

P1354 -- 8-1 飞行员配对方案问题 时间限制:1000MS      内存限制:131072KB      通过/提交人数:38/90 状态:Accepted      标签:    图论-网络流   图论-二分图   无 Description 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1 名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英

【题解】飞行员配对方案问题

Description 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1 名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. Input Description 由文件input.

「网络流24题」1. 飞行员配对方案问题

「网络流24题」1. 飞行员配对方案问题 <题目链接> 比较经典的一道二分图最大匹配. 匈牙利算法走起啊. 算出答案后,输出每个外籍飞行员匹配的点(如果有)即可. 匈牙利算法,简而言之就是,每个x部点u去找自己能匹配上的第一个y部点v,如果v还没有被匹配,或是v已经匹配的x部点w还能匹配其他y部点)就将x与y匹配. 「如果我除了她(v)还能追到别的妹子,我就把她让给你.」--w对x如是说. 代码简明易懂. #include <cstdio> #include <cstring