zoukankan      html  css  js  c++  java
  • 洛谷 P 2756 飞行员配对方案问题

    题目背景

    第二次世界大战时期..

    题目描述

    英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

    对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

    输入输出格式

    输入格式:

     

    第 1 行有 2 个正整数 m 和 n。n 是皇家空军的飞行员总数(n<100);m 是外籍飞行员数。外籍飞行员编号为 1~m;英国飞行员编号为 m+1~n。

    接下来每行有 2 个正整数 i 和 j,表示外籍飞行员 i 可以和英国飞行员 j 配合。最后以 2个-1 结束。

     

    输出格式:

     

    第 1 行是最佳飞行员配对方案一次能派出的最多的飞机数 M。接下来 M 行是最佳飞行员配对方案。每行有 2个正整数 i 和 j,表示在最佳飞行员配对方案中,飞行员 i 和飞行员 j 配对。如果所求的最佳飞行员配对方案不存在,则输出‘No Solution!’。

     

    输入输出样例

    输入样例#1:
    5 10
    1 7
    1 8
    2 6
    2 9
    2 10
    3 7
    3 8
    4 7
    4 8
    5 10
    -1 -1
    输出样例#1:
    4
    1 7
    2 9
    3 8
    5 10 
     1 //本来就纳闷 要是答案有多租解怎么办呢 
     2 //结果   WA了 
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 using namespace std;
     7 #define maxn 1500
     8 #define INF 0x7f
     9 #include<queue>
    10 int n,m,head[maxn],tot,ans,dep[maxn],cur[maxn];
    11 int to[maxn];// 用于输出答案
    12 bool vis[maxn];
    13 struct Edge{
    14     int from,to,next,value;
    15 }e[10010];
    16 void Add_Egde(int u,int v,int w){
    17     e[++tot].from=u;e[tot].to=v;e[tot].value=w;
    18     e[tot].next=head[u];head[u]=tot;
    19 }
    20 bool BFS(int s,int t){
    21     queue<int>q;
    22     for(int i=0;i<=n+1;i++)  //优化 
    23         cur[i]=head[i];
    24     memset(dep,-1,sizeof(dep));
    25     memset(vis,false,sizeof(vis));
    26     dep[s]=0;vis[s]=true;q.push(s);
    27     while(!q.empty()){
    28         int u=q.front();q.pop();vis[u]=false;
    29         for(int i=head[u];i;i=e[i].next){
    30             int v=e[i].to;
    31             if(e[i].value>0&&dep[v]==-1){
    32                 dep[v]=dep[u]+1;
    33                 if(!vis[v]){q.push(v);vis[v]=true;}
    34                 if(v==t)return true;
    35             }
    36         }
    37     }
    38     return false;
    39 }
    40 int DFS(int u,int t,int limit){
    41     int maxf,flow=0,i;
    42     if(limit==0)return 0;
    43     if(u==t)return limit;
    44     for(i=cur[u];i!=-1;i=e[i].next){
    45         cur[u]=i;
    46         int v=e[i].to,w=e[i].value;
    47         if (dep[v]==dep[u]+1 
    48             && (maxf=DFS(e[i].to,t,min(limit,e[i].value)))){
    49             if(maxf) to[u]=v;
    50             flow+=maxf;
    51             limit-=maxf;
    52             e[i].value-=maxf;
    53             e[i^1].value+=maxf;
    54             to[u]=v;
    55             if(!limit) break;;
    56         }
    57     }
    58     return flow;
    59 }
    60 void Dinic(int s,int t){
    61     while(BFS(s,t))
    62         ans+=DFS(s,t,INF);
    63 }
    64 int read(){
    65     int x=0,f=1;
    66     char c;
    67     c=getchar();
    68     while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
    69     while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
    70     return x*f;
    71 }
    72 int main(){
    73     m=read();n=read();
    74     memset(head,-1,sizeof(head));
    75     int t= n+1,s=0;
    76     int u,v;
    77     for(int i=1;i<=m;i++){
    78         Add_Egde(s,i,1);Add_Egde(i,s,0);
    79     }
    80     for(int i=m+1;i<=n;i++){
    81         Add_Egde(i,t,1);Add_Egde(t,i,0);
    82     }
    83     u=read();v=read();
    84     while(u!=-1&&v!=-1){
    85         Add_Egde(u,v,1);
    86         Add_Egde(v,u,0);
    87         u=read();v=read();
    88     }
    89     
    90     Dinic(0,n+1);
    91     if(ans){
    92         printf("%d
    ",ans);
    93         for(int i=1;i<=m;i++)
    94             if(to[i])
    95                 printf("%d %d
    ",i,to[i]);
    96     }
    97     else printf("No Solution!");
    98     return 0;
    99 }

     1 //略有不同 
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdio>
     5 using namespace std;
     6 #define maxn 1500
     7 #define INF 1e9
     8 #include<queue>
     9 int n,m,head[maxn],tot=-1,ans,dep[maxn],cur[maxn];
    10 int to[maxn];// 用于输出答案
    11 bool vis[maxn];
    12 struct Edge{
    13     int from,to,next,value;
    14 }e[10010];
    15 void Add_Egde(int u,int v,int w){
    16     e[++tot].from=u;e[tot].to=v;e[tot].value=w;
    17     e[tot].next=head[u];head[u]=tot;
    18 }
    19 bool BFS(int s,int t){
    20     queue<int>q;
    21     for(int i=0;i<=n+1;i++)  //优化 
    22         cur[i]=head[i];
    23     memset(dep,-1,sizeof(dep));
    24     memset(vis,false,sizeof(vis));
    25     dep[s]=0;vis[s]=true;q.push(s);
    26     while(!q.empty()){
    27         int u=q.front();q.pop();vis[u]=false;
    28         for(int i=head[u];i;i=e[i].next){
    29             int v=e[i].to;
    30             if(e[i].value>0&&dep[v]==-1){
    31                 dep[v]=dep[u]+1;
    32                 if(!vis[v]){q.push(v);vis[v]=true;}
    33                 if(v==t)return true;
    34             }
    35         }
    36     }
    37     return false;
    38 }
    39 int DFS(int u,int t,int limit){
    40     int maxf,flow=0,i;
    41     if(limit==0)return 0;
    42     if(u==t)return limit;
    43     for(i=head[u];i!=-1;i=e[i].next){
    44         int v=e[i].to,w=e[i].value;
    45         if (dep[v]==dep[u]+1 
    46             && (maxf=DFS(e[i].to,t,min(limit,e[i].value)))){
    47             if(maxf) to[u]=e[i].to;
    48             flow+=maxf;
    49             limit-=maxf;
    50             e[i].value-=maxf;
    51             e[i^1].value+=maxf;
    52             to[u]=e[i].to;
    53             if(!limit) break;;
    54         }
    55     }
    56     return flow;
    57 }
    58 void Dinic(int s,int t){
    59     while(BFS(s,t))
    60         ans+=DFS(s,t,INF);
    61 }
    62 int read(){
    63     int x=0,f=1;
    64     char c;
    65     c=getchar();
    66     while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
    67     while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
    68     return x*f;
    69 }
    70 int main(){
    71     m=read();n=read();
    72     memset(head,-1,sizeof(head));
    73     int t= n+1,s=0;
    74     int u,v;
    75     for(int i=1;i<=m;i++){
    76         Add_Egde(s,i,1);Add_Egde(i,s,0);
    77     }
    78     for(int i=m+1;i<=n;i++){
    79         Add_Egde(i,t,1);Add_Egde(t,i,0);
    80     }
    81     u=read();v=read();
    82     while(u!=-1&&v!=-1){
    83         Add_Egde(u,v,1);
    84         Add_Egde(v,u,0);
    85         u=read();v=read();
    86     }
    87     
    88     Dinic(0,n+1);
    89     if(ans){
    90         printf("%d
    ",ans);
    91         for(int i=1;i<=m;i++)
    92             if(to[i])
    93                 printf("%d %d
    ",i,to[i]);
    94     }
    95     else printf("No Solution!");
    96     return 0;
    97 }

     
  • 相关阅读:
    PDF文件中的Form保存问题
    Understanding IP Fragmentation
    tcp ip guide IPsec IKE
    Windows安全事件日志中的事件编号与描述
    Cisco PIX fix up and Juniper firewall FTP ALG
    很好的IPSec介绍,详细解释了IKE协商的2个阶段的作用
    virtualbox 下运行Ubuntu 8.10的分辨率和guest additions的问题。
    Fixing the ‘Do you want to display nonsecure items’ message
    windows xp 开始菜单里面所有项目右键不起作用。
    HP backup and recovery manager
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6504313.html
Copyright © 2011-2022 走看看