zoj2314 Reactor Cooling (无源汇的有上下界的最大流)
2017-11-24 20:13
337 查看
上界用ci表示,下界用bi表示。
下界是必须流满的,那么对于每一条边,去掉下界后,其自由流为ci– bi。
主要思想:每一个点流进来的流=流出去的流
对于每一个点i,令
Mi= sum(i点所有流进来的下界流)– sum(i点所有流出去的下界流)
如果Mi大于0,代表此点必须还要流出去Mi的自由流,那么我们从源点连一条Mi的边到该点。
如果Mi小于0,代表此点必须还要流进来Mi的自由流,那么我们从该点连一条Mi的边到汇点。
然后求S->T的最大流,看是否满流(S的相邻边都流满)。
满流则有解,否则无解。
下界是必须流满的,那么对于每一条边,去掉下界后,其自由流为ci– bi。
主要思想:每一个点流进来的流=流出去的流
对于每一个点i,令
Mi= sum(i点所有流进来的下界流)– sum(i点所有流出去的下界流)
如果Mi大于0,代表此点必须还要流出去Mi的自由流,那么我们从源点连一条Mi的边到该点。
如果Mi小于0,代表此点必须还要流进来Mi的自由流,那么我们从该点连一条Mi的边到汇点。
然后求S->T的最大流,看是否满流(S的相邻边都流满)。
满流则有解,否则无解。
#include <bits/stdc++.h> using namespace std; #define ll long long #define N 210 #define inf 0x3f3f3f3f inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int tst,n,m,h ,num=1,a[N*N],in ,T=201,lev ; struct edge{ int to,next,val; }data[50000]; inline void add(int x,int y,int val){ data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val; data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=0; } inline bool bfs(){ queue<int>q;memset(lev,0,sizeof(lev)); q.push(0);lev[0]=1; while(!q.empty()){ int x=q.front();q.pop(); for(int i=h[x];i;i=data[i].next){ int y=data[i].to;if(lev[y]||!data[i].val) continue; lev[y]=lev[x]+1;q.push(y); } }return lev[T]; } int dinic(int x,int low){ if(x==T) return low;int tmp=low; for(int i=h[x];i;i=data[i].next){ int y=data[i].to;if(lev[y]!=lev[x]+1||!data[i].val) continue; int res=dinic(y,min(tmp,data[i].val)); if(!res) lev[y]=0;tmp-=res;data[i].val-=res;data[i^1].val+=res; if(!tmp) return low; }return low-tmp; } int main(){ // freopen("a.in","r",stdin); tst=read(); while(tst--){ n=read();m=read();num=1;memset(h,0,sizeof(h));int tot=0; memset(in,0,sizeof(in)); for(int i=1;i<=m;++i){ int x=read(),y=read();a[i]=read();int mx=read(); in[y]+=a[i];in[x]-=a[i];add(x,y,mx-a[i]); }for(int i=1;i<=n;++i) if(in[i]>0) add(0,i,in[i]),tot+=in[i];else add(i,T,-in[i]); int ans=0;while(bfs()) ans+=dinic(0,inf); if(ans!=tot) puts("NO"); else{ puts("YES"); for(int i=1;i<=m;++i) printf("%d\n",a[i]+data[i<<1|1].val); }puts(""); }return 0; }
相关文章推荐
- [ZOJ2314]Reactor Cooling(无源汇有上下界的可行流+讲解)
- SGU - 194 Reactor Cooling(无源无汇有上下界最大流)
- SGU 194 Reactor Cooling(无源汇有上下界最大流)
- sgu-194-Reactor Cooling(无源汇有上下界最大流)
- ZOJ2314 Reactor Cooling(无源汇流量有上下界网络的可行流)
- sgu-194-Reactor Cooling(无源汇有上下界最大流)
- 【无源汇上下界最大流】SGU 194 Reactor Cooling
- zoj2314 经典 无源汇有上下界最大流 并输出可行流
- [ZOJ2314]Reactor Cooling(无源汇有上下界的可行流)
- 【无源汇上下界最大流】SGU 194 Reactor Cooling
- 【无源汇点上下界最大流】[SGU194]Reactor Cooling
- zoj 2314 Reactor Cooling--无源汇有上下界最大流--递归sap
- 最大流问题——无源汇有上下界最大流 sgu194 Reactor Cooling
- [伪·ZOJ2314] 无源汇有上下界的最大流
- sgu194:Reactor Colling(无源无汇上下界最大流)
- SGU 194. Reactor Cooling【无源汇上下界最大流】
- HDU 4940 无源无汇上下界最大流
- 【无源汇有上下界可行流】ZOJ-2314 Reactor Cooling
- ZOJ 3229 无源汇上下界最大流
- 上下界网络流建模方法 无源无汇可行流 最大/最小流