最大流模板2
来源:互联网 发布:圣火明尊进阶数据 编辑:程序博客网 时间:2024/06/15 00:51
template<int N,typename T> struct MaxFlow { int s,t,head[N],etot,que[N],qf,qe,dis[N],cur[N]; struct Edge {int v,next; T cap;}g[501000]; void init() { memset(head,-1,sizeof(head)); etot = 0; } void add_edge(int u,int v,T cap) { g[etot].v = v; g[etot].next = head[u]; g[etot].cap = cap; head[u] = etot ++; g[etot].v = u; g[etot].next = head[v]; g[etot].cap = 0; head[v] = etot ++; } bool bfs() { memset(dis,-1,sizeof(dis)); memcpy(cur,head,sizeof(cur)); dis[t] = N; qf = qe = 0; que[qe++] = t; while (qf!=qe) { int u = que[qf++]; for (int i = head[u]; i != -1; i = g[i].next) { Edge &e = g[i]; if (g[i^1].cap && dis[e.v] == -1) { dis[e.v] = dis[u] - 1; que[qe++] = e.v; } } } return dis[s] != -1; } T dfs(int u,T a) { if (u==t) return a; T flow = 0,f; for (int &i = cur[u]; i != -1; i = g[i].next) { Edge &e = g[i]; if (e.cap && dis[e.v] > dis[u]) { f = dfs(e.v,std::min(a,e.cap)); flow += f; e.cap -= f; g[i^1].cap += f; a -= f; if (a==0) break; } } if (flow==0) dis[u] = -1; return flow; } T dinic(int _s,int _t) { s = _s; t = _t; T flow = 0; while (bfs()) flow += dfs(s,(T)1e30); return flow; }};
0 0
- 最大流模板2
- 最大流算法模板
- 最大流算法模板
- 最大流模板
- 最大流模板
- 最大流ISAP模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流dinic模板
- 最大流Dinic模板
- 最大流 ISAP 模板
- 最大流dinci模板
- 最大网络流 模板
- CGRectContainsPoint的具体用法解释
- ubuntu sublime配置
- 手把手教你打造一个Material Design风格的App(四)
- 对不同隔离级别的理解
- 数值的整数次方(不考虑大数问题)
- 最大流模板2
- 第十二周 程序填空
- struts2+jsp+jquery+Jcrop实现图片裁剪并上传
- 图像处理和图像识别中常用的OpenCV函数 (转)
- C++运算符重载(11) - 重载<<和>>操作符
- Unity中的Lerp函数
- poj2096 Collecting Bugs(概率dp)
- gridview与adapter使用实例
- 一篇写得很不错的socket文章,通俗易懂