• 网络流24题 飞行员配对方案问题


    题目描述

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

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

    输入输出格式

    输入格式:

    第 1 行有 2 个正整数 m 和 n。n 是皇家空军的飞行员总数(n<100);m 是外籍飞行员数(m<=n)。外籍飞行员编号为 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 

    超级源点S与1~m连流量为1的边,m+1~n与超级汇点T连流量为1的边,所给的边,连流量为2e9

    直接dinic,判断边是否有流量,即判断反向边的权值是否不为0

    听说NOIP2017会有网络流????

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<queue>
      6 using namespace std;
      7 struct Node
      8 {
      9   int next,to,c;
     10 }edge[20001];
     11 int head[501],num=1,dist[1001],cur[1001],n,m,ans;
     12 void add(int u,int v,int c)
     13 {
     14   num++;
     15   edge[num].next=head[u];
     16   head[u]=num;
     17   edge[num].to=v;
     18   edge[num].c=c;
     19 }
     20 bool bfs(int S,int T)
     21 {int i;
     22   memset(dist,-1,sizeof(dist));
     23   queue<int>Q;
     24   Q.push(S);
     25   dist[S]=1;
     26   while (!Q.empty())
     27     {
     28       int u=Q.front();
     29       Q.pop();
     30       for (i=head[u];i;i=edge[i].next)
     31     {
     32       int v=edge[i].to;
     33       if (edge[i].c>0&&dist[v]==-1)
     34         {
     35           dist[v]=dist[u]+1;
     36           Q.push(v);
     37         }
     38     }
     39     }
     40   if (dist[T]==-1) return 0;
     41   return 1;
     42 }
     43 int dfs(int x,int flow,int des)
     44 {
     45   int res=0;
     46   if (x==des) return flow;
     47   for (int &i=cur[x];i;i=edge[i].next)
     48     {
     49       int v=edge[i].to;
     50       if (dist[v]==dist[x]+1&&edge[i].c)
     51     {
     52       int tmp=dfs(v,min(flow-res,edge[i].c),des);
     53       if (tmp<0) continue;
     54       edge[i].c-=tmp;
     55       edge[i^1].c+=tmp;
     56       res+=tmp;
     57       if (res==flow) return res;
     58     }
     59     }
     60   return res;
     61 }
     62 void Dinic(int S,int T)
     63 {
     64   ans=0;
     65   while (bfs(S,T))
     66     {
     67       memcpy(cur,head,sizeof(cur));
     68       int a=0;
     69       while (a=dfs(S,2e9,T)) ans+=a;
     70     }
     71   return;
     72 }
     73 int main()
     74 {int x,y,i,S,T;
     75   cin>>m>>n;
     76   scanf("%d%d",&x,&y);
     77   while (x!=-1&&y!=-1)
     78     {
     79       add(x,y,2e9);
     80       add(y,x,0);
     81       scanf("%d%d",&x,&y);
     82     }
     83   for (i=1;i<=m;i++)
     84     add(0,i,1),add(i,0,0);
     85   for (i=m+1;i<=n;i++)
     86     add(i,n+1,1),add(n+1,i,2e9);
     87   S=0;T=n+1;
     88   Dinic(0,n+1);
     89   if (ans==0)
     90     {
     91       cout<<"No Solution!";
     92       return 0;
     93     }
     94   cout<<ans<<endl;
     95   for (i=2;i<=num;i+=2)
     96     {
     97       if (edge[i].to==S||edge[i^1].to==S) continue;
     98       if (edge[i].to==T||edge[i^1].to==T) continue;
     99       if (edge[i^1].c)
    100     {
    101       printf("%d %d
    ",edge[i^1].to,edge[i].to);
    102     }
    103     }
    104 }
  • 相关阅读:
    10个令人惊奇的HTML5和JavaScript效果
    SQL Server 错误代码:17058 。解决方案
    [备忘]ASP.NET 惊爆新安全漏洞 攻击者可访问任意文件
    Senparc Google Sitemap(代号:SenMapic)网站地图生成器升级至v1.3
    Error 1 Project file must include the .NET Framework assembly 'PresentationCore, PresentationFramework' in the reference
    [备忘].NET Framework V2.0 Obsolete API List
    [备忘]在VirtualBox中收缩虚拟磁盘映像文件
    [备忘]修改SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径
    [备忘]解决ManualResetEvent.WaitOne在Silverlight环境下将整个UI线程卡死,并无法继续调用异步子线程的问题
    [备忘]21个演示展示强大的jQuery特效
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/7754907.html
Copyright © 2020-2023  润新知