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

题目描述

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

对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

解析

虽说是网络瘤题,但是显然可以用二分图水过去。刚好最近学了二分图,就把这题水了

显然是个二分图最大匹配的板子,搞一个匈牙利,输出所有匹配就过了。更何况这题还有SPJ,想怎么搞怎么搞。

参考代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<bitset>
#define N 210
using namespace std;
int f[N],n,m;
vector<int> g[N];
bitset<N> v;
inline bool dfs(int x)
{
    for(register int i=0;i<g[x].size();++i){
        int y=g[x][i];
        if(v[y]) continue;
        v[y]=1;
        if(!f[y]||dfs(f[y])){
            f[y]=x;
            return 1;
        }
    }
    return 0;
}
int main()
{
    scanf("%d%d",&n,&m);
    int i,j;
    while(~scanf("%d%d",&i,&j)&&i!=-1&&j!=-1)
        g[i].push_back(j);
    int ans=0;
    for(int i=1;i<=n;++i){
        v.reset();
        if(dfs(i)) ans++;
    }
    if(ans){
        printf("%d\n",ans);
        for(int i=1;i<=n+m;++i)
            if(f[i]) printf("%d %d\n",f[i],i);
    }
    else printf("No Solution!\n");
    return 0;
}

原文地址:https://www.cnblogs.com/DarkValkyrie/p/11369414.html

时间: 2024-11-05 12:34:01

P2756 飞行员配对方案问题[二分图最大匹配]的相关文章

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

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

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

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

luogu P2756 飞行员配对方案问题

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

洛谷 P2756 飞行员配对方案问题

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

P2756 飞行员配对方案问题

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

[洛谷P2756]飞行员配对方案问题

题目大意:有m个外籍飞行员和n个英国飞行员,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.现在一架飞机要一名外籍飞行员和一名英国飞行员开,且他们必须有默契,求一次最多能开出多少飞机. 解题思路:明显二分图匹配,我用的匈牙利算法(当然网络流也可以,只不过代码量会大一点). C++ Code: #include<bits/stdc++.h> using namespace std; int m,n,s; bool b[105][105],used[105]; int lft[105];

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

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

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

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

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

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