网络流增广路(无费用)模板
2016-06-16 23:31
330 查看
紫书上的模板~
有很多新写法,以前没有见过呐~
有很多新写法,以前没有见过呐~
struct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f): from(u),to(v),cap(c),flow(f) {} //有冒号,无分号,有花括号 }; struct EdmondsKarp{ int n,m; vector<Edge> edges; vector<int> G[maxn]; int a[maxn]; int p[maxn]; void init(int n) { for(int i=0;i<n;i++) G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int cap) { edges.push_back(Edge(from,to,cap,0)); edges.push_back(Edge(to,from,0,0)); m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } int MaxFlow(int s,int t) { int flow=0; for(;;) { memset(a,0,sizeof(a)); queue<int> q; q.push(s);a[s]=INF; //要加要加要加~ while(!q.empty()) { int z=q.front();q.pop(); for(int i=0;i<G[z].size();i++) { Edge e=edges[G[z][i]]; if(!a[e.to] && e.cap>e.flow) { a[e.to]=min(a[z],e.cap-e.flow); p[e.to]=G[z][i];q.push(e.to); } } if(a[t]) break; } if(!a[t]) break; for(int i=t;i!=s;i=edges[p[i]].from) { edges[p[i]].flow+=a[t]; edges[p[i]^1].flow-=a[t]; } flow+=a[t]; } return flow; } };
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性