Dinic Algorithm to solve max flow problem
来源:互联网 发布:java string是什么类型 编辑:程序博客网 时间:2024/06/07 17:08
//// main.cpp// Dinic//// Created by Longxiang Lyu on 8/12/16.// Copyright © 2016 Longxiang Lyu. All rights reserved.//// reference:// https://sites.google.com/site/indy256/algo_cpp/dinic_flow// the example is from wikipedia page:// https://en.wikipedia.org/wiki/Dinic%27s_algorithm// the prove for dinic can be found at:// http://cseweb.ucsd.edu/classes/sp11/cse202-a/lecture8-final.pdf// this algorithm is proved to run in O(m*n*n) time#include <iostream>#include <vector>#include <algorithm>#include <queue>#include <stack>using namespace std;bool dinic_bfs(vector<vector<int>> &graph, vector<int> &dist, int src, int dest){ int V = static_cast<int>(graph.size()); dist.clear(); dist.resize(V, -1); dist[src] = 0; queue<int> q; q.push(src); while (!q.empty()) { int u = q.front(); q.pop(); for (int v = 0; v != V; ++v) { if (dist[v] < 0 && graph[u][v] > 0) { dist[v] = dist[u] + 1; q.push(v); } } } return dist[dest] >= 0;}int dinic_dfs(vector<vector<int>> &graph, vector<int> &dist, int u, int dest, int bottleneck){ if (u == dest) return bottleneck; int V = static_cast<int>(graph.size()); for (int v = 0; v != V; ++v) { if (dist[v] == dist[u] + 1 && graph[u][v] > 0) { int _bottleneck = dinic_dfs(graph, dist, v, dest, min(bottleneck, graph[u][v])); if (_bottleneck > 0) { // augment this path graph[u][v] -= _bottleneck; graph[v][u] += _bottleneck; return _bottleneck; } } } return 0; }int dinic(vector<vector<int>> &graph, int src, int dest){ int max_flow = 0; vector<int> dist; // ensure dest is reachable from src while (dinic_bfs(graph, dist, src, dest)) { // find the blocking flow from current residual graph while(int bottleneck = dinic_dfs(graph, dist, 0, 5, INT_MAX)) max_flow += bottleneck; } return max_flow;}int main(int argc, const char * argv[]) { vector<vector<int>> graph = {{0, 10, 10, 0, 0, 0}, {0, 0, 2, 4, 8, 0}, {0, 0, 0, 0, 9, 0}, {0, 0, 0, 0, 0, 10}, {0, 0, 0, 6, 0, 10}, {0, 0, 0, 0, 0, 0}}; cout << "Max Flow: " << dinic(graph, 0, 5) << endl; return 0;}
0 0
- Dinic Algorithm to solve max flow problem
- Ford-Fulkerson algorithm to solve the max flow problem
- hdu3549 Flow Problem (Dinic)
- HDU 3549--Flow Problem 【最大流 && dinic】
- hdu 3549 Flow Problem【Dinic最大流】
- hdu3549 Flow Problem(EKarp||Dinic)
- Flow Problem 【最大流 dinic】模版
- HDU 3549 Flow Problem (Ford-Fulkerson&Dinic)
- [max-flow]ford-fulkerson algorithm (转)
- Sliding Window algorithm template to solve all the Leetcode substring search problem.
- Graham Scan Algorithm solve convex hull problem
- how to solve aliasing problem
- hdoj 3549 Flow Problem 【最大流入门 dinic算法】
- hdu 3549 Flow Problem(简单网络流Dinic)
- hdu3549 Flow Problem(dinic算法和ISAP算法)
- hdu 3549 Flow Problem (最大流—EK—Dinic)
- [HDU] 3549 Flow Problem [最大流][Dinic][读取优化]
- HDU3549:Flow Problem(最大流 & Ek算法 + Dinic算法)
- 【hdu】1011 Starship Troopers【树形背包】
- linux下安装python mysql驱动
- 个人对c++语言的理解,猜测一下语言创造者的思想
- CodeForces 27E 素数筛,暴力
- Count Complete Tree Nodes
- Dinic Algorithm to solve max flow problem
- 添加iis的wolf、wolf2、svg字体和json支持
- [leetcode] 367. Valid Perfect Square
- css常用简写总结
- iOS图像处理(6)在内存上下文中绘图
- 使用树莓派Webcam透过Bluemix AlchemyAPI 识别人脸
- cygwin 安装apt-cyg命令
- //封装发送http请求的工具包
- 大闹天宫 页游 架设教程 自玩 单机