http://acm.sgu.ru/problem.php?contest=0&problem=176

有源汇上下界最小流,可以选择跟有源汇上下界最大流一样的建图方式,然后用二分去二分t->s这条边的流量,最小的可行流就是答案。

也可以这样:

跟无源汇最大流建图一样,然后不添加t->s的边

对ss->tt求最大流,然后添加t->s的边,求ss->tt最大流,若是满流,则t->s的流量就是最小流

PS:记录一下:SGU的ID是068720

第二种建图方式:

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<iostream>
  6. #define inf 0x7fffffff
  7. const int maxn=;
  8. const int maxe=maxn*maxn+;
  9. int tot,go[maxe],first[maxn],next[maxe],flow[maxe];
  10. int op[maxe],id[maxe],n,m,du[maxn],cnt[maxn],dis[maxn];
  11. int dn[maxe];
  12. int read(){
  13. int t=,f=;char ch=getchar();
  14. while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
  15. while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
  16. return t*f;
  17. }
  18. void insert(int x,int y,int z){
  19. tot++;
  20. go[tot]=y;
  21. next[tot]=first[x];
  22. first[x]=tot;
  23. flow[tot]=z;
  24. }
  25. void add(int x,int y,int z){
  26. insert(x,y,z);op[tot]=tot+;
  27. insert(y,x,);op[tot]=tot-;
  28. }
  29. int dfs(int x,int f,int S,int T,int nodes){
  30. if (x==T) return f;
  31. int mn=nodes,sum=;
  32. for (int i=first[x];i;i=next[i]){
  33. int pur=go[i];
  34. if (flow[i]&&dis[pur]+==dis[x]){
  35. int F=std::min(f-sum,flow[i]);
  36. int save=dfs(pur,F,S,T,nodes);
  37. flow[i]-=save;
  38. flow[op[i]]+=save;
  39. sum+=save;
  40. if (f==sum||dis[S]>=nodes) return sum;
  41. }
  42. if (flow[i]) mn=std::min(mn,dis[pur]);
  43. }
  44. if (sum==){
  45. cnt[dis[x]]--;
  46. if (cnt[dis[x]]==) dis[S]=nodes;
  47. else {
  48. dis[x]=mn+;
  49. cnt[dis[x]]++;
  50. }
  51. }
  52. return sum;
  53. }
  54. int mxflow(int S,int T,int nodes){
  55. int res=;
  56. for (int i=;i<=nodes;i++) cnt[i]=dis[i]=;
  57. while (dis[S]<nodes) res+=dfs(S,inf,S,T,nodes);
  58. return res;
  59. }
  60. int main(){
  61. int s,t;
  62. n=read();m=read();
  63. s=;t=n+;
  64. for (int i=;i<=m;i++){
  65. int u=read(),v=read(),c=read(),pd=read();
  66. if (pd){
  67. du[u]-=c;
  68. du[v]+=c;
  69. add(u,v,);
  70. dn[i]=c;id[i]=tot;
  71. }else{
  72. add(u,v,c);
  73. dn[i]=;id[i]=tot;
  74. }
  75. }
  76. int sum=;
  77. for (int i=;i<=n;i++)
  78. if (du[i]<) add(i,t,-du[i]);
  79. else add(s,i,du[i]),sum+=du[i];
  80. int sum1=mxflow(s,t,t+);
  81. add(n,,inf);
  82. int sum2=mxflow(s,t,t+);
  83. int sx=;
  84. for (int i=first[s];i;i=next[i]){
  85. if (flow[i]){
  86. puts("Impossible");
  87. return ;
  88. }
  89. }
  90. printf("%d\n",flow[tot]);
  91. for (int i=;i<=m;i++)
  92. printf("%d ",flow[id[i]]+dn[i]);
  93.  
  94. return ;
  95. }

SGU176 Flow construction的更多相关文章

  1. sgu176 Flow Construction【有源汇有上下界最小流】

    同样是模板题. 首先将有源汇转换为无源汇,假设原来的源汇为st,我们加入的源汇为ST,那么我们应该从t到s连一条流量为+∞的边,使原来的st满足收支平衡,退化为普通节点. 分离必要边和其他边,从S到T ...

  2. Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法

    /** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...

  3. sgu Flow construction

    Flow construction 题目: 给出N个节点M条水管,要求在满足上下界的情况下.满足起点最小的流量. 算法: 这是最小流????不知道.仅仅知道用求解上下界最大流的方法就过了. 做这题收获 ...

  4. SGU 176 Flow construction(有源汇上下界最小流)

    Description 176. Flow construction time limit per test: 1 sec. memory limit per test: 4096 KB input: ...

  5. sgu 176 Flow construction(有源汇的上下界最小流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...

  6. SGU 176.Flow construction (有上下界的最大流)

    时间限制:0.5s 空间限制:4M 题意: 有一个由管道组成的网络,有n个节点(n不大于100),1号节点可以制造原料,最后汇集到n号节点.原料通过管道运输.其中有一些节点有管道连接,这些管道都有着最 ...

  7. SGU 176 Flow construction (有源有汇有上下界最小流)

    题意:给定 n 个点,m 条有向边,如果有向边的标号是1的话,就表示该边的上界下界都为容量 ,如果有向边的标号为0的哈,表示该边的下界为0,上界为容量 ,现在问,从 1 到 n 的最小流是多少,并输出 ...

  8. SGU 176 Flow construction【有上下界最小流】

    正好考到了所以翻一些题来做--猛然发现搞了半个月的网络流却没做两道上下界(不过这种题好像是比较少233) 首先建立超级源汇ss,tt,没限制的边照常连,对于有限制的边(u,v,mn,mx),连接(u, ...

  9. Kuangbin 带你飞专题十一 网络流题解 及模版 及上下界网络流等问题

    首先是几份模版 最大流:虽然EK很慢但是优势就是短.求最小割的时候可以根据增广时的a数组来判断哪些边是割边.然而SAP的最大流版我只会套版,并不知道该如何找到这个割边.在尝试的时候发现了一些问题.所以 ...

随机推荐

  1. Codeforces 509C Sums of Digits

    http://codeforces.com/contest/509/problem/C  题目大意: 给出一个序列,代表原序列对应位置数的每一位的数字之和,原序列单调递增,问原序列的最后一个数最小的方 ...

  2. poj3164 (朱刘算法 最小树形图)

    题目大意:给定n个点坐标,m条有向边,要求最小树形图. 题解:直接上模板,前面打的 vis[v]=i一直把i打成1,一直TLE. #include<iostream> #include&l ...

  3. Unity中的关节

    关节组件一共分为5大类,它们分别是链条关节.固定关节.弹簧关节.角色关节和可配置关节.链条关节(Hinge Joint):将两个物体以链条的形式绑在一起,当力量过大超过链条的固定力矩时,两个物体就会产 ...

  4. Android去除系统自带动画的两种方法

    方法一: 在startActivity()或者finish()后紧跟调用: ((Activity) mContext).overridePendingTransition(0, 0); 方法二: 在一 ...

  5. CPU使用率统计办法

    我们在搞性能测试的时候,对后台服务器的CPU利用率监控是一个常用的手段.服务器的CPU利用率高,则表明服务器很繁忙.如果前台响应时间越来越大,而后台CPU利用率始终上不去,说明在某个地方有瓶颈了,系统 ...

  6. 网络测试工具netperf

    Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求 ...

  7. 实现简单的django上传文件

    本文用django实现上传文件并保存到指定路径下,没有使用forms和models,步骤如下: 1.在模板中使用form表单,因为这个表单使用于上传文件的,所以method属性必须设置为post,而且 ...

  8. [CSAPP笔记][第二章信息的表示和处理]

    信息的表示和处理 2.1 信息存储 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器. 存储器的每个字节由一个唯一的数字表示,称为它的地址 所有可能地址的集合称为虚拟地址空间 2.1.1 十 ...

  9. 普通用户之间的ssh无密码访问设置方法

    两台CentOS6.2服务器,客户端是node1,服务器是node2,先都用root用户配置,方法如下: 第一步:在客户端Node1:生成密匙对,我用的是rsa的密钥.使用命令 "ssh-k ...

  10. Asp.Net HttpApplication请求管道与Session(一)

    1.请求处理顺序执行事件 /********************请求处理顺序执行事件**********************/ /// <summary> /// 请求入站 /// ...