zoj 2314Reactor Cooling

秘制神奇上下界网络流%%%

什么什么有(木)源汇可行流什么的,,看不懂(一下纯属个人sb言论)

看了半天知道点,一个点u,从S连到u的流量是全部流入u的下界,u到T是全部流出u的下界和。(进去出来的约一下)

感觉这个的意思就是保持从进入到出来的下界都符合(强行构造相等??),并且如果能满流,则上界也符合。那么就是可行的。

看了个有上下界最大流什么的,连一个从T-S的边,然后原图就成了无原汇了,那么再加TT,SS,搞上面的,判断可行的同时可以得出来S-T的流量,是一个可行流量。设为sum1.

那么去掉S-T的边和SS,TT点,在跑了一遍的图上跑最大流,就是使原有的图继续增广,可以得出另一个最大流sum2,那么ans=sum1+sum2。(就看了这么一点,sb)

  1 #include<bits/stdc++.h>
  2 #define N 100005
  3 #define LL long long
  4 #define inf 0x3f3f3f3f
  5 #define ls tr[x][0]
  6 #define rs tr[x][1]
  7 using namespace std;
  8 inline int ra()
  9 {
 10     int x=0,f=1; char ch=getchar();
 11     while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
 12     while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
 13     return x*f;
 14 }
 15 const int S=0,T=201;
 16 int n,m,cnt;
 17 int head[205],cur[205],h[205],q[2050],in[205];
 18 int low[100005];
 19 struct data{int to,next,v;}e[100005];
 20 void ine(int x, int y, int v)
 21 {
 22     e[++cnt].to=y;
 23     e[cnt].next=head[x];
 24     e[cnt].v=v;
 25     head[x]=cnt;
 26 }
 27 void insert(int x, int y, int v)
 28 {
 29     ine(x,y,v); ine(y,x,0);
 30 }
 31 bool bfs()
 32 {
 33     for (int i=1; i<=T; i++) h[i]=-1;
 34     int l=0,r=1; q[0]=S; h[S]=0;
 35     while (l<r)
 36     {
 37         int x=q[l++];
 38         for (int i=head[x];i;i=e[i].next)
 39             if (e[i].v && h[e[i].to]==-1)
 40             {
 41                 h[e[i].to]=h[x]+1;
 42                 q[r++]=e[i].to;
 43             }
 44     }
 45     if (h[T]==-1) return 0;
 46     return 1;
 47 }
 48 int dfs(int x, int f)
 49 {
 50     if (x==T) return f;
 51     int w,ww=0;
 52     for (int i=head[x];i;i=e[i].next)
 53         if (h[e[i].to]==h[x]+1)
 54         {
 55             w=dfs(e[i].to,min(e[i].v,f-ww));
 56             ww+=w; e[i].v-=w; e[i^1].v+=w;
 57             if (ww==f) return f;
 58         }
 59     if (!ww) h[x]=-1;
 60     return ww;
 61 }
 62 void dinic()
 63 {
 64     while (bfs()) dfs(S,inf);
 65 }
 66 void build()
 67 {
 68     for (int i=1; i<=n; i++)
 69         if (in[i]>0) insert(S,i,in[i]);
 70             else insert(i,T,-in[i]);
 71 }
 72 bool jud()
 73 {
 74     for (int i=head[S];i;i=e[i].next)
 75         if (e[i].v) return 0;
 76     return 1;
 77 }
 78 int main()
 79 {
 80     int t=ra();
 81     while (t--)
 82     {
 83         cnt=1;
 84         memset(head,0,sizeof(head));
 85         memset(in,0,sizeof(in));
 86         n=ra(); m=ra();
 87         for (int i=1; i<=m; i++)
 88         {
 89             int x=ra(),y=ra(); low[i]=ra(); int w=ra();
 90             in[x]-=low[i]; in[y]+=low[i];
 91             insert(x,y,w-low[i]);
 92         }
 93         build(); dinic();
 94         if (!jud()) cout<<"NO"<<endl;
 95         else{
 96             cout<<"YES"<<endl;
 97             for (int i=1; i<=m; i++)
 98                 printf("%d\n",e[(i<<1)^1].v+low[i]);
 99         }
100         cout<<endl;
101     }
102     return 0;
103 }
时间: 2024-11-09 12:44:25

zoj 2314Reactor Cooling的相关文章

zoj Reactor Cooling

Reactor Cooling 无源汇上下界最大流问题. 1.流量平衡. 2.满足上下界 模板题. #include <iostream> #include <queue> #include <vector> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 200000 + 10; const int INF = 1 << 30; s

ZOJ 2314/SGU194 Reactor Cooling

无源汇点上下界可行流问题..... 建图: 对于一条边 u--->v  low(u,v) high(u,v) 连边 u--->v high(u,v) - low(u,v)  就变成了无上下界的网络流问题了 但这样不一定满足low的关系 ,所以我每要再每个点流量后面加上low..... 设自由流g(u,v)=high(u,v) - low(u,v) 每一个点的流量由自由流g和下界流low组成.... 变一下型: 可以看到每个点流入流出的流量不一定平衡... 我们用一个数组low记录每个点的下界流

zoj 2314 Reactor Cooling (无源汇上下界可行流)

Reactor Coolinghttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear re

zoj 2314 Reactor Cooling 网络流

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear reactor to produce plutonium for the nuclear bomb they are planning to create. Be

【有上下界网络流】【ZOJ】2314 Reactor Cooling

[算法]有上下界网络流-无源汇(循环流) [题解] 无源汇网络流相当于重建图后跑最大流. 循环流要求每个点(或边)的流入量和流出量相等. http://www.cnblogs.com/liu-runda/p/6262832.html http://hzwer.com/3356.html 入度>出度时(in[x]>0)时,需要流出去,所以从源向点引一条边,引诱它流出去. 入度<出度时(in[x]<0)时,需要流进来,所以从点向汇引一条边,引诱它流进来. 为何这样正确?源和汇的作用只是

zoj 2314 Reactor Cooling 有上下界的网络最大流

输出的时候发现不会对原来的矩阵排序,只好重新搞了一储存边的一维数组,然后排序. #include<bits/stdc++.h> using namespace std; const int N=256; const int inf=0x7fffffff; struct type { int b,c,f; int no; }; struct node { int no,f; }g[20000+5]; int cmp(node a,node b) { return a.no<b.no; }

ZOJ 2314 Reactor Cooling 带上下界的网络流

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质. 并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li. 求的是最大流. 很久之前就看了带上下界的网络流,一直没看懂

ZOJ 2314 Reactor Cooling 无源汇有上下界网络流

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意:给出N个点,M条边的有向图,每条边的有上下界规定,问是否存在一个可行流满足条件,如果满足输出YES并输出每条边的流量. 如果不满足输出NO. 根据周源的<一种简易的方法求解流量有上下界的网络中网络流问题> 无源汇上下界网络流的做法是: 设边u->v的下界是B(u,v),上界是C(u,v). 设M(i)为对于i结点的流入i的下界总和-流出i的下界总

ZOJ 2314 Reactor Cooling(无源汇上下界网络流)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题意: 给出每条边流量的上下界,问是否存在可行流,如果存在则输出. 思路:先定义D(u)为顶点u发出的所有弧的流量下界与进入顶点u的所有弧的流量下界和之差(out[u]-in[u]). 对于无源汇的网络流来说: (1)新增两个顶点S(附加源点)和T(附加汇点). (2)对原网络中每个顶点u,计算出D(u),如果D(u)>0,则增加一条新弧<u,T>,这条弧的