zoukankan      html  css  js  c++  java
  • 【网络流24题】 No.5 圆桌问题 (多重匹配)

    【题意】

      假设有来自 n 个不同单位的代表参加一次国 际会议。每个单位的代表数分别为
    r i n
    i , = 1,2, 。会议餐厅共有 m 张餐桌,每张餐桌可容纳 ci (i = 1,2, , m) 个代表就餐。
    为了使代表们充分交流, 希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,
    给出满足要求的代表就餐方案。

    输入文件示例
    input.txt
    4 5
    4 5 3 5
    3 5 2 6 4

    输出文件示例
    output.txt
    1
    1 2 4 5
    1 2 3 4 5
    2 4 5
    1 2 3 4 5

    【分析】

      st->u 流量为代表的个数

      u->v 流量为 1

         v->ed 流量为容量

      判满流

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<cstring>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<queue>
      7 #include<cmath>
      8 using namespace std;
      9 #define Maxn 4100
     10 #define INF 0xfffffff
     11 
     12 struct node
     13 {
     14     int x,y,f,o,next;
     15 }t[Maxn*1010];int len;
     16 int first[Maxn];
     17 
     18 int mymin(int x,int y) {return x<y?x:y;}
     19 
     20 void ins(int x,int y,int f)
     21 {
     22     t[++len].x=x;t[len].y=y;t[len].f=f;
     23     t[len].next=first[x];first[x]=len;t[len].o=len+1;
     24     t[++len].x=y;t[len].y=x;t[len].f=0;
     25     t[len].next=first[y];first[y]=len;t[len].o=len-1;
     26 }
     27 
     28 int st,ed;
     29 queue<int > q;
     30 int dis[Maxn];
     31 bool bfs()
     32 {
     33     while(!q.empty()) q.pop();
     34     memset(dis,-1,sizeof(dis));
     35     q.push(st);dis[st]=0;
     36     while(!q.empty())
     37     {
     38         int x=q.front();
     39         for(int i=first[x];i;i=t[i].next) if(t[i].f>0)
     40         {
     41             int y=t[i].y;
     42             if(dis[y]==-1)
     43             {
     44                 dis[y]=dis[x]+1;
     45                 q.push(y);
     46             }
     47         }
     48         q.pop();
     49     }
     50     if(dis[ed]==-1) return 0;
     51     return 1;
     52 }
     53 
     54 int ffind(int x,int flow)
     55 {
     56     if(x==ed) return flow;
     57     int now=0;
     58     for(int i=first[x];i;i=t[i].next) if(t[i].f>0)
     59     {
     60         int y=t[i].y;
     61         if(dis[y]==dis[x]+1)
     62         {
     63             int a=ffind(y,mymin(flow-now,t[i].f));
     64             t[i].f-=a;
     65             t[t[i].o].f+=a;
     66             now+=a;
     67         }
     68         if(now==flow) break;
     69     }
     70     if(now==0) dis[x]=-1;
     71     return now;
     72 }
     73 
     74 void output()
     75 {
     76     for(int i=1;i<=len;i+=2)
     77      printf("%d->%d %d
    ",t[i].x,t[i].y,t[i].f);
     78 }
     79 
     80 int max_flow()
     81 {
     82     int ans=0;
     83     while(bfs())
     84     {
     85         ans+=ffind(st,INF);
     86         // printf("--%d
    ",ans);
     87         // output();
     88     }
     89     return ans;
     90 }
     91 
     92 
     93 int main()
     94 {
     95     int m,n,sm=0;
     96     scanf("%d%d",&m,&n);
     97     st=n+m+1;ed=st+1;
     98     for(int i=1;i<=m;i++)
     99     {
    100         int x;
    101         scanf("%d",&x);
    102         sm+=x;
    103         ins(st,i,x);
    104     }
    105     for(int i=1;i<=n;i++)
    106     {
    107         int x;
    108         scanf("%d",&x);
    109         ins(i+m,ed,x);
    110     }
    111     for(int i=1;i<=m;i++)
    112      for(int j=1;j<=n;j++)
    113          ins(i,j+m,1);
    114     int x=max_flow();
    115     if(x<sm) printf("0
    ");
    116     else
    117     {
    118         printf("1
    ");
    119         // output();
    120         int now=0;
    121         for(int i=1;i<=len;i+=2) if(t[i].x!=st&&t[i].y!=ed&&t[i].f==0)
    122         {
    123             if(now!=0&&t[i].x!=now) printf("
    ");
    124             now=t[i].x;
    125            printf("%d ",t[i].y-m);
    126         }
    127     }
    128     return 0;
    129 }
    View Code

    这题要special judge ,网上找不到可以交的地方,权且当我对了吧。。

    2016-11-04 11:10:17

  • 相关阅读:
    NodeJS学习笔记 进阶 (11)Nodejs 进阶:调试日志打印:debug模块
    NodeJS学习笔记 进阶 (10)Nodejs 进阶:log4js入门实例(ok))
    NodeJS学习笔记 进阶 (9)express+cookie-parser:签名机制深入剖析(ok)
    NodeJS学习笔记 进阶 (8)express+morgan实现日志记录(ok)
    NodeJS学习笔记 进阶 (7)express+session实现简易身份认证(ok)
    NodeJS学习笔记 进阶 (6)本地调试远程服务器上的Node代码(ok)
    NodeJS学习笔记 进阶 (5)将图片转成datauri嵌入到html(ok)
    51nod 1287 线段树
    51nod 1043 数位dp
    51nod 1042 数位dp
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6029486.html
Copyright © 2011-2022 走看看