poj1273
2015-12-14 20:40
459 查看
题目很明显是网络流问题
使用Edmonds-Karp算法
每次对图进行bfs寻找增广路径 然后记录这个路径
flow[i][j] 从i到j的流量
capacity[i][j]为从i到j的最大的容量
每次找到增广路径后 将残余流量放在a[m]中
对整个路径上的点进行流量的更新
直到找不到增广路径
使用Edmonds-Karp算法
每次对图进行bfs寻找增广路径 然后记录这个路径
flow[i][j] 从i到j的流量
capacity[i][j]为从i到j的最大的容量
每次找到增广路径后 将残余流量放在a[m]中
对整个路径上的点进行流量的更新
直到找不到增广路径
#include <iostream> #include <queue> using namespace std; const int INF = 0XFFFFFF; const int MAXSIZE = 200; /* flow[i][j]为当前流量 capacity[i][j]为容量 p[i]为路径中的前驱节点 a[i]为从s到i的路径中的网络残余量 */ int flow[MAXSIZE][MAXSIZE], capacity[MAXSIZE][MAXSIZE], p[MAXSIZE], a[MAXSIZE]; int s, e,m;//s为开始点 e为终点 m为顶点的个数 int EdmondsKarp() { int sum = 0; queue<int> q; while (1) { memset(a, 0, sizeof(a));//每次进行bfs之前清空网络残余流量 a[s] = INF; q.push(s); while (!q.empty()) { int u; u = q.front(); q.pop(); for (int v = 1; v <= m; v++) { if (!a[v] && flow[u][v] < capacity[u][v]) { p[v] = u; a[v] = min(a[u], capacity[u][v] - flow[u][v]); q.push(v); } } } if (a[m] == 0)//没有找到增广路径则退出循环 break; sum += a[m];//加上本次的残余流量 for (int i = m; i != s; i = p[i])//更新flow[][]当前流量 { flow[p[i]][i] += a[m]; flow[i][p[i]] -= a[m]; } } return sum; } int main(int argc,char**argv) { int n;//n为边的个数 m为点的个数 int u, v, w; while (cin >> n >> m) { s = 1; e = m; memset(flow, 0, sizeof(flow)); memset(capacity, 0, sizeof(capacity)); for (int i = 0; i < n; i++) { cin >> u >> v >> w; capacity[u][v] += w; } cout << EdmondsKarp() << endl; } return 0; }
相关文章推荐
- Elasticsearch学习 -- 01(2.1.0 版本安装)
- Android:自定义Toast 随记
- SecureCRT 7.3.4破解版(含注册机)
- 蓝盾杯总结
- 数据结构(一):查找和排序
- JAVA-桥接设计模式
- CodeForces 392C (斐波那契和矩阵的联系)
- hadoop环境搭建图文剖析
- 僵尸进程 and 孤儿进程
- MATLAB中tic和toc函数的简单用法
- 随想11:论管理
- SGU 242. Student's Morning( 网络流 )
- egret 开发阶段 显示屏幕像素坐标
- ADO方式操作数据库
- Zero-Copy&sendfile浅析
- cuda编程学习5——波纹ripple
- jSON Call can throw but it is not marked with try
- Mysql的安装及配置
- 我们该如何有效的与PD沟通呢?
- bzoj1497[NOI2006]最大获利