网络流
2016-05-25 17:11
344 查看
//网络流 #include <stdio.h> #include <iostream> #include <string.h> #include <queue> const int N = 1005; int pre ; //保存增广路径上的点的前驱顶点 bool vis ; int map ; //残留网络容量 int s, t; //s为源点,t为汇点 int n, m; bool BFS() //找增广路 { int i, cur; std::queue<int>Q; memset(pre, 0, sizeof(pre)); memset(vis, 0, sizeof(vis)); vis[s] = true; Q.push(s); while (!Q.empty()) { cur = Q.front(); Q.pop(); if (cur == t) return true; //如果已达到汇点t,表明已经找到一条增广路径,返回true. for (i = 1; i <= n; i++) { if (!vis[i] && map[cur][i]) //只有残留容量大于0时才存在边 { Q.push(i); pre[i] = cur; vis[i] = true; } } } return false; } int Max_Flow() { int i, ans = 0; while (true) { if (!BFS()) return ans; //如果找不到增广路径就返回。 int Min = 999999999; for (i = t; i != s; i = pre[i]) //通过pre[]数组查找增广路径上的边,求出残留容量的最小值。 Min = std::min(Min, map[pre[i]][i]); for (i = t; i != s; i = pre[i]) { map[pre[i]][i] -= Min; map[i][pre[i]] += Min; } ans += Min; } } int main() { int T, k = 1; int u, v, c; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); s = 1; t = n; memset(map, 0, sizeof(map)); while (m--) { scanf("%d%d%d", &u, &v, &c); map[u][v] += c; } printf("Case %d: %d\n", k++, Max_Flow()); } return 0; }
相关文章推荐
- Android 同步网络时间
- Volley的基本用法 使用Volley加载网络图片
- HTTP协议缓存策略深入详解之etag妙用
- 基于HTTP在互联网传输敏感数据的消息摘要、签名与加密方案
- Erlang gen_tcp相关问题汇编索引
- Linux网络管理之net-tools VS iproute2
- HTTP状态码
- http-关于application/x-www-form-urlencoded等字符编码的解释说明
- php 使用tcpdf库输出pdf
- http错误404.17 错误代码 0x80070032 问题解决
- OKHttp 请求库
- okhttpUtils 框架的理解
- VirtualBox ubuntu server内外网皆通的网络连接设置
- jpeg图片接收显示测试上位机[串口 网络 摄像头上位机软件 开源]
- TCP协议三次握手、四次挥手
- vnc使用
- Volley学习笔记(二)
- 关于从浏览器到数据库之间的网络连接
- DNS原理及其解析过程剖析
- Http接口获取数据