原题见#6000. 「网络流 24 题」搭配飞行员 - 题目 - LibreOJ (loj.ac)
题目描述
飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员。由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多。
因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行。
输入格式
第一行,两个整数 与 ,表示共有 个飞行员,其中有 名飞行员是正驾驶员。
下面有若干行,每行有 个数字 、。表示正驾驶员 和副驾驶员 可以同机飞行。
注:正驾驶员的编号在前,即正驾驶员的编号小于副驾驶员的编号。
输出格式
仅一行一个整数,表示最大起飞的飞机数。
样例
输入复制
10 5
1 7
2 6
2 10
3 7
4 8
5 9
输出复制
4
数据范围与提示
2<=n<=10000
#include<cstdio>
#include<cstring>
int a[100][100],b[100],t[100];
int n,m;
int dfs(int i)
{
for(int j=1+m;j<=n;j++)
if(a[i][j]&&!b[j])
{
b[j]=1;
if(!t[j]||dfs(t[j]))
{
t[j]=i;return 1;
}
}
return 0;
}
int main()
{
int i,k,j,s=0;
scanf("%d%d",&n,&m);
while(~scanf("%d%d",&i,&j))
a[i][j]=1;
for(i=1;i<=m;i++)
{
memset(b,0,sizeof(b));
if(dfs(i)) s++;
}
printf("%d\n",s);
return 0;
}
实例::