【无源汇上下界可行流】ZOJ2314[Reactor Cooling]题解
来源:互联网 发布:软件招商加盟政策 编辑:程序博客网 时间:2024/05/22 14:53
题目概述
有n个点,m根水管,每根水管的流量有上下界,求一种可行流使得每个节点流出的水=流进的水。
解题报告
这道题是经典的无源汇上下界可行流。
示例程序
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=200,maxm=2*(maxn*maxn+maxn),MAXINT=((1<<30)-1)*2+1;int te,n,m,low[maxm+5],num[maxn+5],SS,TT,ful;int E,lnk[maxn+5],cur[maxn+5],dis[maxn+5],que[maxn+5];bool vis[maxn+5];struct Edge{ int cap,flow,nxt,son;Edge() {} Edge(int a,int b,int c,int d) {cap=a;flow=b;nxt=c;son=d;}};Edge e[maxm+5];void Add(int x,int y,int z){ e[E]=Edge(z,0,lnk[x],y);lnk[x]=E++; e[E]=Edge(0,0,lnk[y],x);lnk[y]=E++;}bool Bfs(int st,int gl){ memset(vis,0,sizeof(vis)); int Head=0,Tail=0;que[++Tail]=st;dis[st]=0;vis[st]=true; while (Head!=Tail) { int x=que[++Head]; for (int j=lnk[x];~j;j=e[j].nxt) if (e[j].cap>e[j].flow&&!vis[e[j].son]) { vis[e[j].son]=true;que[++Tail]=e[j].son; dis[e[j].son]=dis[x]+1; } } return vis[gl];}int Dfs(int x,int gl,int MIN=MAXINT){ if (!MIN||x==gl) return MIN; int flow=0,f; for (int &j=cur[x];~j;j=e[j].nxt) if (dis[x]+1==dis[e[j].son]&&(f=Dfs(e[j].son,gl,min(MIN,e[j].cap-e[j].flow)))) { e[j].flow+=f;e[j^1].flow-=f; flow+=f;MIN-=f; if (!MIN) break; } return flow;}int Dinic(int st,int gl){ int MAX=0; while (Bfs(st,gl)) { memcpy(cur,lnk,sizeof(lnk)); MAX+=Dfs(st,gl); } return MAX;}int main(){ freopen("program.in","r",stdin); freopen("program.out","w",stdout); for (scanf("%d",&te);te;te--) { E=0;memset(lnk,255,sizeof(lnk));memset(num,0,sizeof(num)); scanf("%d%d",&n,&m);SS=0;TT=n+1;ful=0; for (int i=1,x,y,z;i<=m;i++) scanf("%d%d%d%d",&x,&y,&low[i],&z),num[x]-=low[i],num[y]+=low[i],Add(x,y,z-low[i]); for (int i=1;i<=n;i++) if (num[i]>0) Add(SS,i,num[i]),ful+=num[i]; else if (num[i]<0) Add(i,TT,-num[i]); if (Dinic(SS,TT)!=ful) printf("NO\n"); else { printf("YES\n"); for (int i=0;i<2*m;i+=2) printf("%d\n",e[i].flow+low[i/2+1]); } if (te>1) putchar('\n'); } return 0;}
阅读全文
0 0
- 【无源汇上下界可行流】ZOJ2314[Reactor Cooling]题解
- ZOJ2314 Reactor Cooling(无源汇上下界可行流)
- zoj2314 Reactor Cooling --- 上下界可行流
- 【zoj2314】Reactor Cooling 无源汇可行流)
- [ZOJ2314]Reactor Cooling(无源汇有上下界的可行流)
- ZOJ 2314 Reactor Cooling 无源汇上下界可行流
- ZOJ--2314--Reactor Cooling【无源汇上下界可行流】
- 【SGU194】Reactor Cooling 无源汇上下界可行流
- sgu194. Reactor Cooling 无源汇上下界可行流
- SGU 194 Reactor Cooling 无源汇上下界可行流
- zoj2314 Reactor Cooling (无源汇的有上下界的最大流)
- 【上下界网络流】ZOJ2314 Reactor Cooling
- SGU 194 Reactor Cooling 无源汇带上下界可行流
- [ZOJ2314]/[SGU194] Reactor Cooling 无源汇有上下界网络流
- ZOJ 2314 Reactor Cooling 上下界网络流(无源汇可行流)
- ZOJ 2314Reactor Cooling 无源汇上下界网络流 可行流
- zoj 2314 Reactor Cooling(无源汇上下界可行流)
- zoj 2314 Reactor Cooling(无源汇上下界的可行流)
- 官方历程 调试STM32F407 VCP例程未知设备问题
- android 自定义 View
- HD 2063 增广路径求二分图最大匹配(匈牙利算法)
- C primer plus(编程练习)file-4.8-6
- Android之HandlerThread源码分析和简单使用(主线程和子线程通信、子线程和子线程通信)
- 【无源汇上下界可行流】ZOJ2314[Reactor Cooling]题解
- [论文笔记]Modeling Interestingness with Deep Neural Networks
- OSG学习:裁剪变换(1)
- 栈的顺序存储结构的相关操作(数据结构)
- StatusBarUtil 状态栏工具类(实现沉浸式状态栏/变色状态栏)
- io-5-netty-工作原理
- C primer plus(编程练习)file-4.8-7
- 字符串分割
- Git总结