zoukankan      html  css  js  c++  java
  • 【网络流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题了,这是第一题,匈牙利算法裸题,当然也可以网络流做,我写的匈牙利。
     
     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
    ",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
    ",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
    ",ans);
    69     /*for(int i=m+1;i<=n;i++) if(match[i])
    70     {
    71         printf("%d %d
    ",match[i],i);
    72     }*/
    73     return 0; 
    74 }
    View Code

    2016-11-04 08:40:05

  • 相关阅读:
    第一次作业
    第四次作业
    第五次作业《构建之法》心得体会
    第三次作业
    第二次作业
    第一次作业
    个人简介
    读《构建之法》有感
    第四次博客园作业(2)
    第四次博客园作业(1)
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6028989.html
Copyright © 2011-2022 走看看