LiberOJ-#6000. 「网络流 24 题」搭配飞行员 (二分图匹配)
原创
©著作权归作者所有:来自51CTO博客作者MichaelZona的原创作品,请联系作者获取转载授权,否则将追究法律责任
#6000. 「网络流 24 题」搭配飞行员
内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: 匿名
提交提交记录统计讨论测试数据
题目描述
飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员。由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多。
因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行。
输入格式
第一行,两个整数
输出格式
仅一行一个整数,表示最大起飞的飞机数。
样例
样例输入
样例输出
数据范围与提示
1 #include "bits/stdc++.h"
2 using namespace std;
3 typedef long long LL;
4 const int MAX=105;
5 int n,m;
6 int a[MAX][MAX],cc[MAX];
7 bool vis[MAX];
8 void init(){
9 int i,j;
10 scanf("%d%d",&n,&m);
11 int u,v;
12 memset(a,0,sizeof(a));
13 while (~scanf("%d%d",&u,&v)) a[u][v]=a[v][u]=1;
14 memset(cc,-1,sizeof(cc));
15 }
16 int match(int u){
17 int i,j;
18 for (i=m+1;i<=n;i++){
19 if (a[u][i] && !vis[i]){
20 vis[i]=true;
21 if (cc[i]==-1 || match(cc[i])){
22 cc[i]=u;
23 return 1;
24 }
25 }
26 }
27 return 0;
28 }
29 int main(){
30 freopen ("pilot.in","r",stdin);
31 freopen ("pilot.out","w",stdout);
32 int i,j;init();
33 int ans=0;
34 for (i=1;i<=m;i++){
35 memset(vis,false,sizeof(vis));
36 ans+=match(i);
37 }
38 printf("%d",ans);
39 return 0;
40