【网络流24题】No.1 搭配飞行员(飞行员配对方案问题)
【问题描述】飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员。由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多。如图,假设有10个驾驶员,如图中的V1,V2,…,V10就代表达10个驾驶员,其中V1,V2,V3,V4,V5是正驾驶员,V6,V7,V8,V9,V10是副驾驶员。如果一个正驾驶员和一个副驾驶员可以同机飞行,就在代表他们两个之间连一条线,两个人不能同机飞行,就不连。例如V1和V7可以同机飞行,而V1和V8就不行。请搭配飞行员,使出航的飞机最多。注意:因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行.【输入格式】输入文件有若干行
第一行,两个整数n与n1,表示共有n个飞行员(2<=n<=100),其中有n1名飞行员是正驾驶员.
下面有若干行,每行有2个数字a,b。表示正驾驶员a和副驾驶员b可以同机飞行。注:正驾驶员的编号在前,即正驾驶员的编号小于副驾驶员的编号.【输出格式】输出文件有一行
第一行,1个整数,表示最大起飞的飞机数。【输入输出样例】输入文件名:10 5
1 7
2 6
2 10
3 7
4 8
5 9输出文件名:4
【分析】
开始做网络流24题了,这是第一题,匈牙利算法裸题,当然也可以网络流做,我写的匈牙利。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 #define Maxn 1100 9 10 struct node 11 { 12 int x,y,next; 13 }t[Maxn];int len; 14 int first[Maxn]; 15 16 void ins(int x,int y) 17 { 18 t[++len].x=x;t[len].y=y; 19 t[len].next=first[x];first[x]=len; 20 } 21 22 int m,n; 23 24 int match[Maxn]; 25 bool chw[Maxn]; 26 bool ffind(int x) 27 { 28 // printf("%d\n",x); 29 for(int i=first[x];i;i=t[i].next) if(!chw[t[i].y]) 30 { 31 int y=t[i].y; 32 chw[y]=1; 33 // printf("%d\n",x); 34 if(!match[y]||ffind(match[y])) 35 { 36 match[y]=x; 37 return 1; 38 } 39 } 40 return 0; 41 } 42 43 int ans; 44 void solve() 45 { 46 memset(match,0,sizeof(match)); 47 ans=0; 48 for(int i=1;i<=n;i++) 49 { 50 memset(chw,0,sizeof(chw)); 51 if(ffind(i)) ans++; 52 } 53 } 54 55 int main() 56 { 57 scanf("%d%d",&m,&n); 58 len=0; 59 memset(first,0,sizeof(first)); 60 while(1) 61 { 62 int x,y; 63 scanf("%d%d",&x,&y); 64 if(x==-1&&y==-1) break; 65 ins(x,y); 66 } 67 solve(); 68 printf("%d\n",ans); 69 /*for(int i=m+1;i<=n;i++) if(match[i]) 70 { 71 printf("%d %d\n",match[i],i); 72 }*/ 73 return 0; 74 }
2016-11-04 08:40:05