LiberOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配
Posted GeekZRF
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LiberOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配相关的知识,希望对你有一定的参考价值。
#6000. 「网络流 24 题」搭配飞行员
内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: 匿名
题目描述
飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员。由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多。
因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行。
输入格式
第一行,两个整数 n nn 与 m mm,表示共有 n nn 个飞行员,其中有 m mm 名飞行员是正驾驶员。
下面有若干行,每行有 2 22 个数字 a aa、b bb。表示正驾驶员 a aa 和副驾驶员 b bb 可以同机飞行。
注:正驾驶员的编号在前,即正驾驶员的编号小于副驾驶员的编号。
输出格式
仅一行一个整数,表示最大起飞的飞机数。
样例
样例输入
10 5
1 7
2 6
2 10
3 7
4 8
5 9
样例输出
4
数据范围与提示
2≤n≤100 2 \leq n \leq 1002≤n≤100
题目链接:https://loj.ac/problem/6000
题意:有n个飞行员,其中m个是正飞行员,一架飞机啊需要一个正一个副的飞行员才能起飞,输出最大飞行数量。
思路:最大匹配版子题
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<set> #include<queue> #include<stack> #include<map> #include<vector> using namespace std; typedef long long ll; typedef pair<int,int> P; const int maxn=200,maxm=1e5+1000,inf=0x3f3f3f3f,mod=1e9+7; const ll INF=1e18+7; int n,m; int g[maxn][maxn]; int used[maxn]; int cy[maxn]; bool dfs(int u) { for(int v=1; v<=n; v++) { if(!g[u][v]) continue; if(used[v]) continue; used[v]=true; if(cy[v]<0||dfs(cy[v])) { cy[v]=u; return true; } } return false; } int solve() { int res=0; memset(cy,-1,sizeof(cy)); for(int i=1; i<=n; i++) { memset(used,false,sizeof(used)); res+=dfs(i); } return res; } int main() { scanf("%d%d",&n,&m); int u,v; while(scanf("%d%d",&u,&v)!=EOF) g[u][v]=1; printf("%d\n",solve()); return 0; }
以上是关于LiberOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配的主要内容,如果未能解决你的问题,请参考以下文章
LiberOJ #6002. 「网络流 24 题」最小路径覆盖
LiberOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题
LiberOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖