luogu P3254 圆桌问题 网络流24
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P3254 圆桌问题 网络流24相关的知识,希望对你有一定的参考价值。
#include <iostream> #include <cstdio> #include <cstring> #define N 100010 using namespace std; int n,m,S,T,tmp1,tmp2,tot; int idx,head[N],cur[N],q[N],ans1[N],ans2[N]; int e[N],ne[N],w[N]; bool b[N]; int r[N],c[N]; inline void add(int u,int v,int f) { e[idx]=v; w[idx]=f; ne[idx]=head[u]; head[u]=idx++; } inline bool bfs() { int f=0,t=0; memset(cur,-1,sizeof(cur)); q[t++]=S; cur[S]=0; while(f<t) { int now=q[f++]; for(int i=head[now]; ~i; i=ne[i]) { int v=e[i]; if(cur[v]==-1&&w[i]) { cur[v]=cur[now]+1; q[t++]=v; } } } if(cur[T]!=-1) return 1; return 0; } inline int dfs(int x,int f) { if(x==T) return f; int w1,used=0; for(int i=head[x]; ~i; i=ne[i]) { int v=e[i]; if(cur[v]==cur[x]+1&&w[i]) { w1=dfs(v,min(f-used,w[i])); w[i]-=w1; w[i^1]+=w1; used+=w1; if(used==f) return f; } } if(!used) cur[x]=-1; return used; } void dinic() { while(bfs()) tot+=dfs(S,0x3f3f3f3f); } int main() { memset(head,-1,sizeof head); scanf("%d %d",&m,&n); S=0,T=n+m+1; int sum=0; for(int i=1; i<=m; i++) { cin>>r[i]; sum+=r[i]; add(0,i,r[i]); add(i,0,0); } for(int i=1; i<=n; i++) { cin>>c[i]; add(i+m,T,c[i]); add(T,i+m,0); } for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) add(i,j+m,1),add(j+m,i,0); dinic(); if(tot!=sum) { puts("0"); return 0; } printf("1 "); for(int l=1; l<=m; ++l) //寻找方案 { for(int i=head[l]; ~i; i=ne[i]) if(e[i]>m&&e[i]<=m+n&&!w[i]) printf("%d ",e[i]-m); printf(" "); } return 0; }
以上是关于luogu P3254 圆桌问题 网络流24的主要内容,如果未能解决你的问题,请参考以下文章