Ford Fulkerson 算法
来源:互联网 发布:水电图设计软件 编辑:程序博客网 时间:2024/05/28 11:48
#include <iostream>#include <cstring>#include <vector>using namespace std;#define MAX_V 100#define INF 1 << 30struct Edge{ int to; int cap; int rec; Edge( int to, int cap, int rec ){ this->to = to; this->cap = cap; this->rec = rec; }};vector< Edge > G[MAX_V];bool visited[MAX_V];void add_edge( int from, int to, int cap ){ Edge e = Edge( to, cap, G[to].size() ); Edge re = Edge( from, cap, G[from].size() ); G[from].push_back( e ); G[to].push_back( re );}int find_flow( int from, int des, int flow ){ if( from == des ) return flow; visited[from] = true; for( int i = 0; i < G[from].size(); ++i ){ Edge& e = G[from][i]; if( !visited[e.to] && e.cap > 0 ){ int f = find_flow( e.to, des, min( flow, e.cap ) ); if( f > 0 ){ e.cap -= f; G[e.to][e.rec].cap += f; return f; } } } return 0;}int max_flow( int src, int des ){ int flow = 0; while( true ){ memset( visited, false, sizeof( visited ) ); int f = find_flow( src, des, INF ); if( f == 0 ) return flow; flow += f; } return flow;}int main(){ add_edge( 1, 2, 3 ); add_edge( 1, 3, 3 ); add_edge( 2, 3, 2 ); add_edge( 2, 4, 3 ); add_edge( 3, 5, 2 ); add_edge( 5, 6, 3 ); add_edge( 4, 5, 4 ); add_edge( 4, 6, 2 ); int flow = max_flow( 1, 6 ); cout << flow << endl; return 0;}
class Edge( object ): def __init__( self, u, v, cap ): self.src = u self.des = v self.cap = cap def __repr__( self ): return "%s -> %s( %s )"%( self.src, self.des, self.cap )class FlowNetwork( object ): def __init__( self ): self.graph = {} self.flow = {} def find_flow( self, src, des, path ): if src == des: return path for e in self.get_edges( src ): residuals = e.cap - self.flow[e] if residuals > 0 and e not in path: res = self.find_flow( e.des, des, path + [e] ) if res != None: return res def max_flow( self, src, des ): while True: path = self.find_flow( src, des, [] ) if path == None: return sum( self.flow[e] for e in self.get_edges( src ) ) residuals = [e.cap - self.flow[e] for e in path] flow = min( residuals ) for e in path: self.flow[e] += flow self.flow[e.re] -= flow def add_vertex( self, v ): self.graph[v] = [] def add_edge( self, u, v, cap ): if u == v: raise ValueError( "u == v" ) e = Edge( u, v, cap ) re = Edge( v, u, cap ) e.re = re re.re = e self.graph[u].append( e ) self.graph[v].append( re ) self.flow[e] = 0 self.flow[re] = 0 def get_edges( self, v ): return self.graph[v]if __name__ == "__main__": g = FlowNetwork() for v in range( 1, 7 ): g.add_vertex( v ) g.add_edge( 1, 2, 3 ) g.add_edge( 1, 3, 3 ) g.add_edge( 2, 3, 2 ) g.add_edge( 2, 4, 3 ) g.add_edge( 3, 5, 2 ) g.add_edge( 5, 6, 3 ) g.add_edge( 4, 5, 4 ) g.add_edge( 4, 6, 2 ) print g.max_flow( 1, 6 )
0 0
- Ford Fulkerson 算法
- Ford-Fulkerson算法的效率
- 最大流 Ford-Fulkerson算法
- 网络流--ford-fulkerson算法
- Ford-Fulkerson Edmonds-Karp算法
- Ford-Fulkerson算法 java实现
- 增广路算法Ford-Fulkerson
- Ford-Fulkerson
- Ford-Fulkerson
- hdu 3549最大流Ford-Fulkerson算法
- 网络流Ford—Fulkerson算法
- 最大流之Ford-Fulkerson算法
- 最大流问题(Ford-Fulkerson算法)
- 网络流问题Ford-Fulkerson算法详解
- 最大流 Ford-Fulkerson算法模板
- 网络流一·Ford-Fulkerson算法
- 最大流算法之Ford-Fulkerson
- HDU3549 Flow Problem(ford-fulkerson算法)
- OSPF系列:distribute-list分发列表
- 判断字符串数组里面为空
- 递归实现链表逆序(不需三个临时指针变量)
- js中的json对象
- 黑马程序员_网络编程(2)
- Ford Fulkerson 算法
- Java(编程语言)--未完成
- 如何使用for循环
- 异常处理
- JS
- 我是一只IT小小鸟。。。。
- Xcode代码行数统计
- 十个最值得阅读学习的C开源项目代码
- 关于java的对象数组