zoukankan      html  css  js  c++  java
  • Cogs 14. [网络流24题] 搭配飞行员

    这道题其实蛮好想的,因为分为正,副飞行员。所以就把正飞行员当作Boy,副飞行员当作Girl。然后做Hungry即可。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int G[131][131],vis[131],girl[131],n,n1;
     4 int hungry(int boy)
     5 {
     6     int i;
     7     for(i=n1+1;i<=n;i++)
     8     {
     9         if(G[boy][i]==1&&vis[i]==0)
    10         {
    11             vis[i]=1;
    12             if(hungry(girl[i])==1||girl[i]==0)
    13             {
    14                 girl[i]=boy;
    15                 return 1;
    16             }
    17         }
    18     }
    19     return 0;
    20 }
    21 int main()
    22 {
    23     int a,b,sum,i;
    24     scanf("%d %d",&n,&n1);
    25     while(scanf("%d %d",&a,&b)!=EOF)G[a][b]=1;
    26     memset(girl,0,sizeof(girl));
    27     sum=0;
    28     for(i=1;i<=n1;i++)
    29     {
    30         memset(vis,0,sizeof(vis));
    31         if(hungry(i)==1)sum++;
    32     }
    33     printf("%d",sum); 
    34     return 0;
    35 }
    View Code
    但这道题是“网络流24题”,所以还是要练一练网络流。所以直接用Dinic做最大流即可。
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<cstdlib>
     5 #include<algorithm> 
     6 using namespace std;
     7 int n,s,t,q[131],dis[131],G[131][131];
     8 int Min(int aaa,int bbb){if(aaa>bbb)return bbb;else return aaa;}
     9 int Bfs()
    10 {
    11     int head,tail,u,v;
    12     memset(q,0,sizeof(q)),head=0,tail=1,q[tail]=s;
    13     memset(dis,-1,sizeof(dis)),dis[s]=0;
    14     while(head<=tail)
    15     {
    16         u=q[++head];
    17         for(v=1;v<=n;v++)
    18         {
    19             if(G[u][v]>0&&dis[v]<0)
    20             {
    21                 dis[v]=dis[u]+1;
    22                 q[++tail]=v;
    23             }
    24         }
    25     }
    26     if(dis[n]<=0)return 0;
    27     else return 1;
    28 }
    29 int Dfs(int u,int minflow)
    30 {
    31     int v,ans;
    32     if(u==n)return minflow;
    33     for(v=1;v<=n;v++)
    34     {
    35         if(G[u][v]>0&&dis[v]==dis[u]+1)
    36         {
    37             ans=Dfs(v,Min(minflow,G[u][v]));
    38             if(ans!=0)
    39             {
    40                 G[u][v]-=ans;
    41                 G[v][u]+=ans;
    42                 return ans;
    43             }
    44         } 
    45     }
    46     return 0;
    47 }
    48 int Dinic()
    49 {
    50     int maxflow=0,ans;
    51     while(Bfs()!=0)
    52     {
    53         ans=Dfs(s,0x7fffffff);if(ans==0)break;maxflow+=ans;
    54     }
    55     return maxflow;
    56 }
    57 int main()
    58 {
    59     int n1,a,b,i;
    60     scanf("%d %d",&n,&n1);
    61     while(scanf("%d %d",&a,&b)!=EOF)G[a][b]=1;
    62     n+=2;s=n-1;t=n;
    63     for(i=1;i<=n1;i++)G[s][i]=1;
    64     for(i=n1+1;i<=n-2;i++)G[i][t]=1;
    65     printf("%d",Dinic());
    66     return 0; 
    67 }
    View Code



  • 相关阅读:
    【11】 Java基础 <十一> —— equals的重写
    【10】 Java基础 <十> —— 用个人方法实现构造器的排序
    【9】 Java基础<九> —— 构造器的重载
    【8】 Java基础 <八> —— 方法的重载
    【7】 Java基础 <七> —— 自动装箱 自动拆箱
    【6】 Java基础 <六> —— super关键字
    Linux ssh下实现免密码登录(转载)
    Centos7 安装配置python3虚拟环境 virtualenvwrapper(转载)
    Linux 安装python3.7.0
    TOMCAT 日志自动删除
  • 原文地址:https://www.cnblogs.com/wjcwjc/p/4992459.html
Copyright © 2011-2022 走看看