#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
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 }