1 /*
  2     题意:无源无汇,并且每条边的容量有上下界限的网络流问题!既然无源无汇,那么素有的节点都应该满足“入流==出流”!
  3          输出每一条边的流量,使得满足上面的条件。(如果u->v有流量,那么v->u就不会有流量)
  4
  5     思路:如果增加了源点s和汇点t,对于u->v(下限为l, 上限为f) 将这一条边拆成3条,s->v(容量为l), u->v(容量为f-l)
  6      u->t(容量为l)这样就变成了每一个点的流入或者流出的流量至少是b!然后从s->t走一遍最大流,如果所有的附件边都已经
  7      满载,则就是所有s->v的边和u->t的边(或者只判断其中一者就可以),那么就存在答案!
  8 */
  9 #include<iostream>
 10 #include<cstdio>
 11 #include<cstring>
 12 #include<algorithm>
 13 #include<vector>
 14 #include<queue>
 15 #define INF 0x3f3f3f3f
 16 #define N 205
 17 #define M 500000
 18 using namespace std;
 19
 20 struct EDGE{
 21     int v, cap, tot, nt, b;
 22     EDGE(){};
 23     EDGE(int v, int cap, int nt, int b) : v(v), cap(cap), nt(nt), b(b), tot(cap){}
 24 };
 25
 26 EDGE edge[M];
 27 int n, m;
 28 int first[N];
 29 int pre[N], d[N];
 30 int sz;
 31 int s, t;
 32 int full, fout;
 33
 34 void addEdge(int u, int v, int b, int cap){
 35     edge[sz] = (EDGE(v, cap, first[u],b));
 36     first[u] = sz++;
 37     edge[sz] = (EDGE(u, 0, first[v], 0));
 38     first[v] = sz++;
 39
 40     edge[sz] = (EDGE(v, b, first[s], 0));
 41     first[s] = sz++;
 42     edge[sz] = (EDGE(s, 0, first[v], 0));
 43     first[v] = sz++;
 44
 45     edge[sz] = (EDGE(t, b, first[u], 0));
 46     full += b;
 47     first[u] = sz++;
 48     edge[sz] = (EDGE(u, 0, first[t], 0));
 49     first[t] = sz++;
 50 }
 51
 52 bool bfs(){
 53     queue<int>q;
 54     memset(d, 0, sizeof(d));
 55     d[s] = 1;
 56     q.push(s);
 57     while(!q.empty()){
 58         int u = q.front(); q.pop();
 59         for(int i = first[u]; ~i; i = edge[i].nt){
 60             int v = edge[i].v;
 61             if(!d[v] && edge[i].cap >0){
 62                 d[v] = d[u] + 1;
 63                 q.push(v);
 64             }
 65         }
 66     }
 67     if(d[t] == 0) return false;
 68     return true;
 69 }
 70
 71 int dfs(int u, int totf){
 72     int ff;
 73     if( u == t) return totf;
 74     int flow = 0;
 75     for(int i = first[u]; ~i && totf > flow; i = edge[i].nt){
 76         int v = edge[i].v;
 77         int cap = edge[i].cap;
 78         //流入u节点的当前总的流量为totf,可以得到 u->v1, u->v2, u->v3....这些路径上的最大流的和为flow+=f(u->vi)
 79         //f(u->vi)表示u节点沿着vi节点方向的路径上的最大流;如果u->vi+1的容量为wi+1,那么u->vi+1所允许流过的最大
 80         //的流量就是 min(totf - cost, wi+1)了!
 81         if(d[v] == d[u] + 1 && cap > 0 ){
 82             ff = dfs(v, min(totf - flow, cap));
 83             if(ff){
 84                 edge[i].cap -= ff;
 85                 edge[i^1].cap += ff;
 86                 flow += ff;
 87             }
 88             else
 89                 d[v] = -1;//表示v这个点无法在继续增广下去了
 90         }
 91     }
 92     return flow;//返回从u节点向外流出的最大流量!
 93 }
 94
 95 bool Dinic(){
 96     while(bfs())
 97         fout += dfs(0, INF);//这一块没想到写成while(dfs())会超时....
 98
 99     if( fout != full) return false;
100     return true;
101 }
102
103 int main(){
104
105         scanf("%d%d", &n, &m);
106     memset(first, -1, sizeof(first));
107     sz = 0;
108     fout = full = 0;
109     s = 0; t = n+1;
110     int u, v, l, f;
111     for(int i = 1; i <= m; ++i){
112         scanf("%d%d%d%d", &u, &v, &l, &f);
113         addEdge(u, v, l, f-l);
114     }
115     if(!Dinic()){
116         printf("NO\n");
117         return 0;
118     }
119     printf("YES\n");
120     for(int i = 1; i <= m; ++i){
121         int j = (i-1)*6;
122         printf("%d\n",  edge[j].tot - edge[j].cap + edge[j].b);//输出这条边实际流过的流量+下限
123     }
124
125     return 0;
126 }

转载于:https://www.cnblogs.com/hujunzheng/p/4006435.html

AC_Dream 1211 Reactor Cooling相关推荐

  1. 【zoj2314】Reactor Cooling 有上下界可行流

    题目描述 The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuc ...

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

    [算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...

  3. ZOJ2314 Reactor Cooling(无源汇流量有上下界网络的可行流)

    题目大概说一个核反应堆的冷却系统有n个结点,有m条单向的管子连接它们,管子内流量有上下界的要求,问能否使液体在整个系统中循环流动. 本质上就是求一个无源汇流量有上下界的容量网络的可行流,因为无源汇的容 ...

  4. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》

    虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...

  5. linux防火墙没看3306访问不,Linux配置防火墙,开启80端口、3306端口

    [原创]开源Math.NET基础数学类库使用(16)C#计算矩阵秩 本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math ...

  6. 图论专题1(网络流)

    推荐阅读: 网络流基础知识和Dinic:http://www.cnblogs.com/SYCstudio/p/7260613.html#3848907 建模:https://www.cnblogs.c ...

  7. 有趣题目和认知合集(持续更新)

    写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...

  8. php无限级分类是什么意思,PHP 无限级分类(递归)

    网上有很多,这是我自己做测试用的 $arr = array( array('id'=>1,'name'=>'电脑','pid'=>0), array('id'=>2,'name ...

  9. java request 获取文件流_HttpRequest获取文件流,HttpResponse输出文件流

    HttpResponse输出文件: Response.Clear(); Response.ContentType = "application/octet-stream"; //通 ...

最新文章

  1. web服务认证的实现
  2. 設計模式之王 - MVC
  3. 《剑指offer》变态跳台阶
  4. tomcat 在eclipse中可以启动,独立不能启动
  5. 【使用注意】以后定义变量类型利用父类定义
  6. C++_类和对象_对象特性_友元_全局函数做友元_在类中声明友元权限的全局函数来访问_类中的private权限的变量---C++语言工作笔记052
  7. 头条和百度“大打出手”时,微信搜索去哪儿了?
  8. 获取元素属性(offsetHeight、clientHeight...)无效
  9. Windows 98 下载
  10. XTU 1236 Fibonacci
  11. js文档模式之混杂模式与标准模式
  12. 用谷歌浏览器模拟打开天眼查网站并爬取需要的数据
  13. php中``反引号的作用
  14. python爬虫:爬取百度小姐姐照片
  15. 能量谷算法Energy Valley Optimizer (EVO)附matlab代码
  16. SQL SERVER根据符号将一列拆分多行
  17. 【观察】华为云连续四年蝉联政务云第一,背后是“长跑选手”实力的印证
  18. 权威数据来了,中国到底有多少个程序员?
  19. 《你必须知道的的495个C语言问题》阅读笔记-(第4章)指针篇
  20. windows系统下注册和检测 ocx,dll控件的问题.........

热门文章

  1. mysql显示百分比例_显示值mysql的百分比
  2. php mysql 绕过_PHP中md5绕过
  3. SpringBoot 使用 Caffeine 本地缓存
  4. VS Code 自动保存 码格式化
  5. SpringBoot2 整合 AXIS2 服务端和客户端
  6. SpringBoot2 集成 xxl-job任务调度中心_路由策略
  7. Java问题集锦--The type StringEscapeUtils is deprecated
  8. 四步获取微信登录所需的openid和session_key
  9. linux 网络dma驱动,S3C2410的Linux下DMA驱动程序开发
  10. BugkuCTF-MISC题贝斯手