【网络流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\n",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\n",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\n");
116     else
117     {
118         printf("1\n");
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("\n");
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

posted @ 2016-11-04 11:05  konjak魔芋  阅读(261)  评论(0编辑  收藏  举报