Dinic 网络流24题 圆桌问题 题解

xiaoxiao2021-02-28  66

裸Dinic模板题,就不bb了,直接贴代码


#include<cstdio> #include<iostream> #include<cstring> #include<queue> #define MAXN 100000+10 #define oo 0x7ffffff using namespace std; int s=0,t,n,m,cnt; struct Line{ int cost,to,next; }line[MAXN]; int head[MAXN],tail,level[MAXN],temp; void add_line(int from,int to,int fee){ tail++;line[tail].to=to; line[tail].cost=fee; line[tail].next=head[from]; head[from]=tail; } bool bfs(){ queue<int>q; memset(level,0xff,sizeof(level)); q.push(s); level[s]=0; while(!q.empty()){ int u=q.front();q.pop(); for(int i=head[u];i;i=line[i].next){ int v=line[i].to; if(level[v]==-1&&line[i].cost>0){ level[v]=level[u]+1; q.push(v); } } } if(level[t]==-1) return false; else return true; } int dfs(int u,int maxflow){ if(u==t) return maxflow; for(int i=head[u];i;i=line[i].next){ int v=line[i].to; if(level[v]==level[u]+1&&line[i].cost>0){ int flow=dfs(v,min(maxflow,line[i].cost)); if(flow>0){ line[i].cost-=flow; line[i^1].cost+=flow; return flow; } } } return 0; } void print(){ for(int i=1;i<=m;i++){ for(int j=head[i];j;j=line[j].next){ int v=line[j].to; if(line[j].cost==1&&line[j].to!=t) printf("%d ",line[j].to-n); } printf("\n"); } } int main() { int n,m; // while(~scanf("%d%d",&n,&m)) // { scanf("%d%d",&n,&m); Init(); int sum = 0; for(int i = 1;i <= n;++i){ scanf("%d",&a[i]); sum += a[i]; } for(int i = 1;i <= m;++i) scanf("%d",&b[i]); Build(n,m); int flow = Maxflow(); if(flow>=sum){ puts("1"); Print(n,m); } else puts("0"); // } return 0; } int main(){ freopen("in.txt","r",stdin); scanf("%d%d",&m,&n);t=0x7ff; for(int i=1;i<=m;i++){ scanf("%d",&temp); add_line(0,i,temp); add_line(i,0,0); } for(int i=m+1;i<=n+m;i++){ scanf("%d",&temp); add_line(i,0x7ff,temp); add_line(0x7ff,i,0); } for(int i=1;i<=m;i++){ for(int j=m+1;j<=n+m;j++){ add_line(i,j,1); add_line(j,i,0); } } while(bfs())cnt+=dfs(s,oo); cout<<cnt<<endl; print(); return 0; }
转载请注明原文地址: https://www.6miu.com/read-59426.html

最新回复(0)