最大网络流
来源:互联网 发布:数据库软件工程师考试 编辑:程序博客网 时间:2024/05/22 15:13
首先是FF算法:
#include <iostream>#include <vector>#include <climits>#include <cstring>using namespace std;const int MAX_V = 1100;struct edge{int to, cap, rev;}; ///邻接表表示,点,容量,反向边vector<edge> G[MAX_V];bool used[MAX_V];/// 贪心策略: 1.找到f < c 或者 f > 0 的边,寻找路径 2.不存在路径则结束,若存在路径则返回1继续寻找void add_edge(int from, int to, int cap) { ///添加边 G[from].push_back((edge){to, cap, G[to].size()}); G[to].push_back((edge){from, 0, G[from].size() - 1});}int dfs(int v, int t, int f) { if(v == t) return f; used[v] = true; for(int i = 0; i < G[v].size(); ++i) { edge &e = G[v][i]; if(!used[e.to] && e.cap > 0) { int d = dfs(e.to, t, min(f, e.cap)); if(d > 0) { e.cap -= d; ///该边减小容量 G[e.to][e.rev].cap += d; ///反向边增加容量 return d; } } }}int max_flow(int s, int t) { int flow = 0; for(;;) { memset(used, 0, sizeof(used)); int f = dfs(s, t, INT_MAX); if(f == 0) return flow; flow += f; }}int main(){ int n; cin >> n; for(int i = 0; i < n; ++i) { int from, to, cap; cin >> from >> to >> cap; add_edge(from, to, cap); } cout << max_flow(0, 4) << endl; return 0;}/*70 1 101 2 60 2 21 3 63 2 33 4 82 4 5*/
#include <iostream>#include <vector>#include <cstring>#include <queue>using namespace std;const int INF = INT_MAX;const int MAX_V = 1000;struct edge { int to, cap, rev;};vector<edge> G[MAX_V];int level[MAX_V];int iter[MAX_V];void add_edge(int from, int to, int cap) ///添加边{ G[from].push_back((edge) {to, cap, G[to].size()}); G[to].push_back((edge) {from, 0, G[from].size() - 1});}void bfs(int s) ///构造最短路径的分层图{ memset(level, -1, sizeof(level)); queue<int> que; level[s] = 0; que.push(s); while(!que.empty()) { int v = que.front(); que.pop(); for(int i = 0; i < G[v].size(); ++i) { edge &e = G[v][i]; if(e.cap > 0 && level[e.to] < 0) { level[e.to] = level[v] + 1; que.push(e.to); } } }}int dfs(int v, int t, int f) { ///深搜路径 if(v == t) return f; for(int &i = iter[v]; i < G[v].size(); ++i) { edge &e = G[v][i]; if(e.cap > 0 && level[v] < level[e.to]) { int d = dfs(e.to, t, min(f, e.cap)); if(d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0;}int max_flow(int s, int t){ int flow = 0; for(;;) { bfs(s); if(level[t] < 0) { return flow; } memset(iter, 0, sizeof(iter)); ///iter之前的边都没有用了 int f; while((f = dfs(s, t, INF)) > 0) { flow += f; } }}int main(){ int n; cin >> n; for(int i = 0; i < n; ++i) { int from, to, cap; cin >> from >> to >> cap; add_edge(from, to, cap); } int s, t; cout << max_flow(0, 4) << endl; return 0;}
0 0
- 网络流--最大流
- 最大流(网络流)
- 网络流 最大流
- 网络流最大流
- 网络流 最大流
- 网络流-最大流
- 网络流--最大流
- 网络流-最大流
- 网络流 最大流
- 网络流-最大流
- 网络流,最大流
- 最大网络流
- 最大网络流
- 网络最大流问题
- POJ1149最大网络流
- 【网络流】最大获利
- 最大网络流PKU1273
- 网络最大流
- 递归算法遍历文件夹中所有文件
- Tomcat配置理解
- Xamarin android沉浸式状态栏
- 策略模式(Strategy Pattern)
- 二叉树的前序遍历
- 最大网络流
- Pixhawk原生固件PX4之添外置传感器MPU6500
- [已解决]您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
- 骄傲的代价
- POJ 3250 Bad Hair Day 算法学习:单调栈
- 孤儿进程与僵尸进程
- ssh连接时的警告
- pandas numpy学习笔记
- valid-palindrome