LibreOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配

时间:2021-05-16 15:04:38

#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=,maxm=1e5+,inf=0x3f3f3f3f,mod=1e9+;
const ll INF=1e18+;
int n,m;
int g[maxn][maxn];
int used[maxn];
int cy[maxn];
bool dfs(int u)
{
for(int v=; v<=n; v++)
{
if(!g[u][v]) continue;
if(used[v]) continue;
used[v]=true;
if(cy[v]<||dfs(cy[v]))
{
cy[v]=u;
return true;
}
}
return false;
}
int solve()
{
int res=;
memset(cy,-,sizeof(cy));
for(int i=; 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]=;
printf("%d\n",solve());
return ;
}

最大匹配