【网络流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 }
这题要special judge ,网上找不到可以交的地方,权且当我对了吧。。
2016-11-04 11:10:17