题意:给出所有计算机之间的路径和路径容量后,求出两个给定结点之间的流通总容量。(假设路径是双向的,且两方向流动的容量相同)

分析:裸最大流。标号从1开始,初始化的时候注意。

  1. #pragma comment(linker, "/STACK:102400000, 102400000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cctype>
  6. #include<cmath>
  7. #include<iostream>
  8. #include<sstream>
  9. #include<iterator>
  10. #include<algorithm>
  11. #include<string>
  12. #include<vector>
  13. #include<set>
  14. #include<map>
  15. #include<stack>
  16. #include<deque>
  17. #include<queue>
  18. #include<list>
  19. #define Min(a, b) ((a < b) ? a : b)
  20. #define Max(a, b) ((a < b) ? b : a)
  21. const double eps = 1e-8;
  22. inline int dcmp(double a, double b){
  23. if(fabs(a - b) < eps) return 0;
  24. return a > b ? 1 : -1;
  25. }
  26. typedef long long LL;
  27. typedef unsigned long long ULL;
  28. const int INT_INF = 0x3f3f3f3f;
  29. const int INT_M_INF = 0x7f7f7f7f;
  30. const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
  31. const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
  32. const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
  33. const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
  34. const int MOD = 1e9 + 7;
  35. const double pi = acos(-1.0);
  36. const int MAXN = 100 + 10;
  37. const int MAXT = 10000 + 10;
  38. using namespace std;
  39. struct Edge{
  40. int from, to, cap, flow;
  41. Edge(int fr, int t, int c, int fl):from(fr), to(t), cap(c), flow(fl){}
  42. };
  43. struct Dinic{
  44. int n, m, s, t;
  45. vector<Edge> edges;
  46. vector<int> G[MAXN];
  47. bool vis[MAXN];
  48. int d[MAXN];
  49. int cur[MAXN];
  50. void init(int n){
  51. edges.clear();
  52. for(int i = 1; i <= n; ++i) G[i].clear();//标号从1开始
  53. }
  54. void AddEdge(int from, int to, int cap){
  55. edges.push_back(Edge(from, to, cap, 0));
  56. edges.push_back(Edge(to, from, 0, 0));
  57. m = edges.size();
  58. G[from].push_back(m - 2);
  59. G[to].push_back(m - 1);
  60. }
  61. bool BFS(){
  62. memset(vis, 0, sizeof vis);
  63. queue<int> Q;
  64. Q.push(s);
  65. d[s] = 0;
  66. vis[s] = 1;
  67. while(!Q.empty()){
  68. int x = Q.front();
  69. Q.pop();
  70. for(int i = 0; i < G[x].size(); ++i){
  71. Edge& e = edges[G[x][i]];
  72. if(!vis[e.to] && e.cap > e.flow){
  73. vis[e.to] = 1;
  74. d[e.to] = d[x] + 1;
  75. Q.push(e.to);
  76. }
  77. }
  78. }
  79. return vis[t];
  80. }
  81. int DFS(int x, int a){
  82. if(x == t || a == 0) return a;
  83. int flow = 0, f;
  84. for(int& i = cur[x]; i < G[x].size(); ++i){
  85. Edge& e = edges[G[x][i]];
  86. if(d[x] + 1 == d[e.to] && (f = DFS(e.to, Min(a, e.cap - e.flow))) > 0){
  87. e.flow += f;
  88. edges[G[x][i] ^ 1].flow -= f;
  89. flow += f;
  90. a -= f;
  91. if(a == 0) break;
  92. }
  93. }
  94. return flow;
  95. }
  96. int Maxflow(int s, int t){
  97. this -> s = s;
  98. this -> t = t;
  99. int flow = 0;
  100. while(BFS()){
  101. memset(cur, 0, sizeof cur);
  102. flow += DFS(s, INT_INF);
  103. }
  104. return flow;
  105. }
  106. }di;
  107. int main(){
  108. int n;
  109. int kase = 0;
  110. while(scanf("%d", &n) == 1){
  111. if(!n) return 0;
  112. di.init(n);
  113. int s, t, c;
  114. scanf("%d%d%d", &s, &t, &c);
  115. for(int i = 0; i < c; ++i){
  116. int x, y, v;
  117. scanf("%d%d%d", &x, &y, &v);
  118. di.AddEdge(x, y, v);//路径双向
  119. di.AddEdge(y, x, v);
  120. }
  121. printf("Network %d\nThe bandwidth is %d.\n\n", ++kase, di.Maxflow(s, t));
  122. }
  123. return 0;
  124. }

  

UVA - 820 Internet Bandwidth (因特网带宽)(最大流)的更多相关文章

  1. UVA 820 Internet Bandwidth 因特网宽带(无向图,最大流,常规)

    题意:给一个无向图,每条边上都有容量的限制,要求求出给定起点和终点的最大流. 思路:每条无向边就得拆成2条,每条还得有反向边,所以共4条.源点汇点已经给出,所以不用建了.直接在图上跑最大流就可以了. ...

  2. UVA - 820 Internet Bandwidth(最大流模板题)

    题目: 思路: 直接套最大流的模板就OK了,注意一下输出的格式. 代码: #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define M ...

  3. UVa 820 Internet Bandwidth (裸板网络流)

    题意:有一个计算机网络,输入节点数n,输入网络流源点和汇点src,des,再输入双向边数m.给出m条边的负载,求最大流. 析:直接上网络流的最大流. 代码如下: #pragma comment(lin ...

  4. UVA 820 Internet Bandwidth

    题意: 给出双向图,求给出两点的流通总流量. 分析: 网络流中的增广路算法. 代码: #include <iostream>#include <cstring>#include ...

  5. UVA 820 --- POJ 1273 最大流

    找了好久这两个的区别...UVA820 WA了 好多次.不过以后就做模板了,可以求任意两点之间的最大流. UVA 是无向图,因此可能有重边,POJ 1273是有向图,而且是单源点求最大流,因此改模板的 ...

  6. UVA 10480 Sabotage (网络流,最大流,最小割)

    UVA 10480 Sabotage (网络流,最大流,最小割) Description The regime of a small but wealthy dictatorship has been ...

  7. light oj 1153 - Internet Bandwidth【网络流无向图】

    1153 - Internet Bandwidth   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  8. Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负

    /** 题目:Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负 链接:https://vjudge.net/problem/UVA-1161 ...

  9. UVa 820 因特网带宽(最大流)

    https://vjudge.net/problem/UVA-820 题意: 给出所有计算机之间的路径和路径容量后求出两个给定结点之间的流通总容量. 思路: 裸的最大流问题.注意有个比较坑的地方,最后 ...

随机推荐

  1. VUE框架下安装自带http协议

    在控制台CMD 中输入 npm install vue-resource --save-dev

  2. JDBC--处理事务

    1.事务是指一组逻辑操作单元,使数据从一种状态转换到另一种状态. 2.事务的四个属性: --1)原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生要么都不发生: --2)一致性:事务必须是数 ...

  3. 「CF650E」Clockwork Bomb

    传送门 Luogu 解题思路 显然对于两棵树共有的边,我们不会动它. 考虑第二颗树中有和第一棵树不同的边怎么处理. 我们设 \(fa_1[u],fa_2[u]\) 分别代表 \(u\) 在两棵树中的父 ...

  4. Hyper-V网卡ping不通本机

    可能的解决方案: 添加网卡时选择"旧版"

  5. ss性能

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...

  6. 吴裕雄--天生自然JAVA数据库编程:事务处理

    DROP TABLE user ; -- 删除表 CREATE TABLE user( id INT AUTO_INCREMENT PRIMARY KEY , name VARCHAR(30) NOT ...

  7. 题解 zr1212 【20WC集训】货币

    题目链接 我们给每个连通块图上一种颜色.不同的连通块涂不同的颜色. 首先,我们定义\(f_r\)表示:使\([l,r]\)包括\([1,r]\)里所有颜色的最大的\(l\). 然后我维护一个变量\(p ...

  8. vscode点击ctrl键报错Request textDocument/definition failed.

    现象 用vscode写java代码的时候突然出现,修复问题点击Ctrl时,输出窗口就打日志,报错Request textDocument/definition failed. 我百度唯一的有用线索就是 ...

  9. System.Data.SqlClient.SqlException: 'Incorrect syntax near 'OFFSET'.

    https://www.nopcommerce.com/boards/t/54586/410-not-running-on-local-system.aspx#209684 Hello, I was ...

  10. putty Linux 自动补全

    用putty连接Ubuntu16.04后,输入命令后按tab键,不自动补全,对上下键无历史命令,$符号顶格显示,无用户名.主机名, 这是由于默认用的sh,可以直接调用bash,进入bash: