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 1002n100

 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 }
未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
原文地址:https://www.cnblogs.com/keximeiruguo/p/7361106.html