AC_Dream 1211 Reactor Cooling

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中const对于define优点,为什么大多数C开发人员使用define而不是const?

这有一个非常可靠的原因&#xff1a;C中的const并不意味着一些常量。 这只是意味着一个variables是只读的。在编译器需要一个常量的地方(例如非VLA数组的数组大小)&#xff0c;使用constvariables(如fieldWidth是不可能的。他们不一样const只是一个限定符&#xff0c;它表示一个…

c语言程序设计期末试卷A,《C语言程序设计》期末试卷(A)..doc

《C语言程序设计》期末试卷(A).2011-12-1学期《C语言程序设计》期末试卷(A)班级____________姓名____________学号________________大题号一二三四总分得 分判卷 /核分人“一、选择题”使用答题卡选择。“二、看程序写运行结果”答题处&#xff1a;题号答 案二、1二、2二、3“三…

codeforces B. Strongly Connected City(dfs水过)

题意&#xff1a;有横向和纵向的街道&#xff0c;每个街道只有一个方向&#xff0c;垂直的街道相交会产生一个节点&#xff0c;这样每个节点都有两个方向&#xff0c; 问是否每一个节点都可以由其他的节点到达.... 思路&#xff1a;规律没有想到&#xff0c;直接爆搜&#xff0…

c语言数组两个值交换,如可交换两个数组中的元素?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include int main(void){int a[]{1,2,3,4,5,6,7,8};int b[]{9,10,11,12,13,15};int lena,lenb,randa,randb,randtimes;int i,temp;srand((unsigned)time(NULL));lena sizeof(a)/sizeof(int);lenb sizeof(b)/s…

Uvaoj 11248 Frequency Hopping(Dinic求最小割)

题意&#xff1a;1到n节点&#xff08;节点之间有一定的容量&#xff09;&#xff0c;需要流过C的流量&#xff0c;问是否可以&#xff1f;如果可以输出possible&#xff0c; 否则如果可以扩大任意一条边的容量 可以达到目的&#xff0c;那么输出possible option&#xff1a;接…

随机数归并排序c语言,用C语言实现归并排序

#include#include#include#include#define random(i) (rand()%i)#define N 12#define INFINITY 99999999//要排序的数存放在a数组汇总&#xff0c;p,q,r是数组下标void Merge(int *a,int p,int q,int r){int n1q-p1;int n2r-q;int *L(int *)malloc(sizeof(int)*n1);int *R(int …

UVAoj 11324 - The Largest Clique(tarjan + dp)

题意&#xff1a;给定一个有向图&#xff0c;寻找一个点数最大集合&#xff0c;使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者u<>v 思路&#xff1a;首先将强连通分量通过tarjan算法求出来&#xff0c;然后进行缩点&#xff0c;也就是每一个缩点 所组成…

android开发蓝牙自动连接电脑上,Android蓝牙开发之自动连接设备

自动连接使用的是SharedPreferences这个来解决。private void Automaticconnection() {SharedPreferences sp getSharedPreferences("Dizhi", MODE_PRIVATE);String address sp.getString("address", "");if (!address.equals("")) …

hdu 2014鞍山赛区 5073 Galaxy

题意&#xff1a;就是给你 n 个数&#xff0c;代表n个星球的位置&#xff0c;每一个星球的重量都为 1 &#xff01; 开始的时候每一个星球都绕着质心转动&#xff0c;那么质心的位置就是所有的星球的位置之和 / 星球的个数 现在让你移动 k 个星球到任意位置&#xff08;多个星球…

android onitemclicklistener 参数,android – 对listview中的项使用setOnItemClickListener

大家好,有一个应用程序,可以在SD卡上保存音频.我创建了一个listview,它从sdcard中检索文件名.我正在尝试设置一个监听器,所以当单击文件名时,我可以启动另一个播放该文件的意图.当我尝试设置监听器并传入一个新的OnItemClickListener()时,eclipse是红色的下划线.我知道我必须实…

DRF之请求与响应

目录 一、模块与包回顾 二、反序列化校验源码分析(了解) 三、断言 四、drf之请求 【1】源码分析 【2】配置视图类能处理的编码格式 五、drf之响应 【1】源码 【2】响应编码格式 一、模块与包回顾 模块与包 什么是模块&#xff1f; 一个py文件&#xff0c;被别的py文件…

android 常用注解,Android 开发小工具之:注解 Annotation

Android Support 包之一的 support-annotations是通过静态编译检测来提高代码质量的一个注解工具。里面包含了 Android 开发中常用的代码检测注解&#xff0c;帮助开发者提高代码质量。通过 SDK Manager下载 Android Support Repository 后&#xff0c;在 Gradle 中通过如下声明…

codeforces B. Friends and Presents(二分+容斥)

题意&#xff1a;从1....v这些数中找到c1个数不能被x整除&#xff0c;c2个数不能被y整除&#xff01; 并且这c1个数和这c2个数没有相同的&#xff01;给定c1, c2, x, y&#xff0c; 求最小的v的值&#xff01; 思路&#xff1a; 二分容斥&#xff0c;二分找到v的值&#xff0c;…

android音量键广播,音量控制键控制的音频流(setVolumeControlStream)描述

音量控制键控制的音频流(setVolumeControlStream)描述2021-01-03 16:18Android教程网 Android当开发多媒体应用或者游戏应用的时候&#xff0c;需要使用音量控制键来设置程序的音量大小,在Android系统中有多种音频流,感兴趣的朋友可以了解下当开发多媒体应用或者游戏应用的时候…

eclipse的使用

eclipse如何打开一个已存在的工程&#xff01;先给eclipse创建一个workspace,这个workspace就是一个文件夹用来管理eclipse项目的&#xff0c;或者修改eclipse的workspace,选择菜单file->switch workspace->other,选择一个已经存在的workspace。将已经存在的项目导入到wo…

Android延伸布局到状态栏,Android 状态栏透明

前言&#xff1a;最近项目大量用到状态栏透明&#xff0c;网上也出现很多库可以直接拿来用&#xff0c;个人认为没有必要那么重引用到一个库(有木有同学和我有一样的想法)&#xff0c;所以研究了一番&#xff0c;在此做个记录加强记忆也便后期查阅&#xff0c;如果无意中有幸能…

glassfish服务器默认的网页所在的位置

http://localhost:8080/ 默认打开的网页所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 转载于:https://www.cnblogs.com/hujunzheng/p/4052920.html

华为HarmonyOS 鸿蒙,华为鸿蒙HarmonyOS2.0手机开发者Beta版正式发布

据悉&#xff0c;本次手机开发者Beta测试支持以下中国境内主制式手机及平板电脑。手机&#xff1a;全网通(5G双卡)P40 、 全网通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G)&#xff0c;型号清单为ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

http协议客户端向服务器端请求时一般需要发送的内容

out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式&#xff0c;文件路径&#xff0c; http协议版本&#xff08;必写&#xff09;请求头.... out.println("Aceept: */*");//客户端能够处理的文件类型&#xff08;不是必须&#xff…

android oneshot自动播放bug,移动端常见bug汇总001

前言本文是摘录整理了移动端常见的一些bug以及解决方案&#xff0c;第一篇&#xff0c;后面还会有持续的文章更新整理。点击样式闪动Q: 当你点击一个链接或者通过Javascript定义的可点击元素的时候&#xff0c;它就会出现一个半透明的灰色背景。A:根本原因是-webkit-tap-highli…