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

题目背景

第二次世界大战时期..

题目描述

英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的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!’。

输入输出样例

输入 #1复制

5 10
1 7
1 8
2 6
2 9
2 10
3 7
3 8
4 7
4 8
5 10
-1 -1

输出 #1复制

4
1 7
2 9
3 8
5 10

提交代码加入收藏

查看题解

这一道题 就是一个非常简单的二分图匹配问题

这里还是稍微复习一下练练手吧

首先第一问自然是非常的简单 就是直接输出一个二分图匹配的最大匹配就可以了

问题是怎么输出配对?

这是一个神奇的问题

其实也就是非常的简单(由他人博客知

那个二分图不是从hav数组是从右边连向左边吗

也就是说从英国连向外籍   那么我们只需要枚举一下外籍飞行员 如果它的hav不为0  就输出hav[i]和i  也就是所对应的的左边的英国飞行员和外籍飞行员

具体看代码咯

#include<bits/stdc++.h>
#define maxn 105
using namespace std;
vector<int> v[maxn];
int vis[maxn],hav[maxn];int tim;
bool Dfs(int rt)
{
    for(int i=0;i<v[rt].size();i++)
    {
        int to=v[rt][i];
        if(vis[to]!=tim)
        {
            vis[to]=tim;
            if(!hav[to]||Dfs(hav[to]))
            {
                hav[to]=rt;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int x,y;
    while(~scanf("%d%d",&x,&y))
    {
        if(x==-1&&y==-1) break;
        v[x].push_back(y);
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        tim++;ans+=Dfs(i);
    }
    printf("%d\n",ans);
    for(int i=1;i<=m;i++)
        if(hav[i])
            printf("%d %d\n",hav[i],i);
    return 0;
}

习题练习
A 部分习题 —(Hungarian算法):
<1> 飞行员配对方案问题 https://www.luogu.org/problemnew/show/2756
<2> [SCOI2010]连续攻击游戏 https://www.luogu.org/problemnew/show/P1640
<3> [ZJOI2009]假期的宿舍 https://www.luogu.org/problemnew/show/P2055
<4> [ZJOI2007]矩阵游戏 https://www.luogu.org/problemnew/show/P1129
<5> 酒店之王 https://www.luogu.org/problemnew/show/P1402

B 部分习题 —(二分图相关定理):
<1> [USACO11NOV]牛的障碍 https://www.luogu.org/problemnew/show/P3033

C 部分习题 —(KM算法):
<1> 运动员最佳匹配问题 https://www.luogu.org/problemnew/show/1559

原文地址:https://www.cnblogs.com/Tidoblogs/p/11478457.html

时间: 2024-08-28 18:49:13

P2756 飞行员配对方案问题 二分图匹配 匈牙利算法的相关文章

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

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

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

HDU1507 Uncle Tom&#39;s Inherited Land* 二分图匹配 匈牙利算法 黑白染色

原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1*2的矩形覆盖所有的不废的点,并且不重叠,问最多可以覆盖多少个1*2的矩形,输出方案,有SPJ. 输入描述: 多组数据,每组首先两个数n,m(如果n和m为0,则结束程序) 然后给出k 然后给出k个二元组(x,y)表示废点的坐标. 题解 按照前两片博文的算法已经不行了,因为方案不对了. 所以我们要进行

USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering problems, all the stalls in the new barn are different. For the first week, Farmer John r

HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 49    Accepted Submission(s): 14 Problem Description There is a kindom of obsession, so people in this kingdom do things very

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

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

P2756 飞行员配对方案问题

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

网络流24题 第一题 - 洛谷2756 飞行员配对方案 二分图匹配 匈牙利算法

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 题意概括 裸的二分图匹配 题解 匈牙利算法 上板子 代码 #include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const int N=100+5; int m,n,a,b,match[N