Dinic 算法
2015-12-02 22:11
239 查看
#include <bits/stdc++.h> using namespace std; const int N (1e5+5), M(1e5+5); int head ; struct Edge{ /* r: residual capacity */ int v, r, nt; }E[M]; int tail; void add_edge(int u, int v, int c){ E[tail]={v, c, head[u]}, head[u]=tail++; E[tail]={u, 0, head[v]}, head[v]=tail++; } int level ; void bfs(int s){ memset(level, -1, sizeof(level)); queue<int> que; level[s]=0; que.push(s); for(int u; !que.empty(); ){ u=que.front(), que.pop(); for(int i=head[u]; ~i; i=E[i].nt){ int &v=E[i].v; if(E[i].r>0 && level[v]<0){ level[v]=level[u]+1; que.push(v); } } } } int iter ; int dfs(int u, int t, int f){ /* t: terminal (sink) */ if(u==t) return f; //for(int &i=iter[u]; i!=-1; i++){ for(int &i=iter[u]; i!=-1; i=E[i].nt){ int &v=E[i].v, &r=E[i].r; if(r>0 && level[u]<level[v]){ int d=dfs(v, t, min(f, r)); if(d>0){ r-=d; E[i^1].r+=d; return d; } } } return 0; } int dinic(int s, int t){ const int INF=1<<30; for(int flow=0;;){ bfs(s); if(level[t]<0) return flow; memcpy(iter, head, sizeof(iter)); for(int f; f=dfs(s, t, INF); flow+=f); } } void init(){ tail=0; memset(head, -1, sizeof(head)); }
相关文章推荐
- 替换字段中第一个相同字符的方法
- 在C++中,关键字explicit的作用
- 使用js获取QueryString的方法小结
- Thinkphp 学习笔记
- border属性黑科技(已被玩坏)
- 02 第一份实习工作之后的三个月
- python写一个日志查询工具(登录ftp服务器得到日志并分析)
- 设计模式之适配器模式
- Android在一个程序中启动另一个程序(包名、类名)
- 输入三个整数,从小到大的顺序输出(利用指针)
- windows驱动开发相关知识
- myeclipse中的web项目详解
- Java 日期类的使用:Date,Calender,SimpleDateFormat的简单使用
- 算法 -- 求两个等长数组的中位数
- [LeetCode]Path Sum
- Git 秘钥管理(服务器和客户端)
- 《系统运维全面解析:技术、管理与实践》章节目录
- Count Primes
- Windows GDI+坐标系统详解(二)
- 学习能力与思考能力