博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大流:Dinic模板
阅读量:6876 次
发布时间:2019-06-26

本文共 1317 字,大约阅读时间需要 4 分钟。

/*Date : 2015-8-21 晚上Author : ITAKMotto :今日的我要超越昨日的我,明日的我要胜过今日的我;以创作出更好的代码为目标,不断地超越自己。*/#include 
#include
using namespace std;///oo表示无穷大const int oo = 1e9+5;///mm表示边的最大数量,因为要双向建边const int mm = 111111;///点的最大数量const int mn = 1000;///node:节点数,src:源点,dest:汇点,edge:边数int node, src, dest, edge;///ver:边指向的结点,flow:边的流量,next:链表的下一条边int ver[mm], flow[mm], next[mm];///head:节点的链表头,work:用于算法中的临时链表头,dis:距离int head[mn], work[mn], dis[mn], q[mn];///初始化void Init(int _node, int _src, int _dest){ node = _node, src = _src, dest = _dest; for(int i=0; i
=0; i=next[i]) if(flow[i] && dis[v=ver[i]]<0) { ///这条边必须有剩余流量 dis[q[r++]=v] = dis[u] + 1; if(v == dest) return 1; } return 0;}///寻找可行流的增广路算法,按节点的距离来找,加快速度int Dinic_dfs(int u, int exp){ if(u == dest) return exp; ///work 是临时链表头,这里用 i 引用它,这样寻找过的边不再寻找* for(int &i=work[u],v,tmp; i>=0; i=next[i]) { if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0) { ///正反向边容量改变 flow[i] -= tmp; flow[i^1] += tmp; return tmp; } } return 0;}///求最大流,直到没有可行流int Dinic_flow(){ int i, ret=0, data; while(Dinic_bfs()) { for(i=0; i

转载地址:http://efwbl.baihongyu.com/

你可能感兴趣的文章
回到顶部
查看>>
dubbo网络通讯(四)
查看>>
全局作用域中,用const和let声明的变量去哪了?
查看>>
测者的测试技术手册:Junit执行单元测试用例成功,mvn test却失败的问题和解决方法...
查看>>
设计模式(二十一)状态模式
查看>>
C语言程序设计复习指导
查看>>
[Vuex系列] - Actions的理解之我见
查看>>
Susy 2 教程 — 入门篇
查看>>
Java Bean Copy 性能大比拼
查看>>
Java中的四种引用
查看>>
第二课 如何在WINDOWS环境下搭建以太坊开发环境
查看>>
浅谈QEMU的对象系统
查看>>
Python那么火,到底能用来做什么?我们来说说Python3的主要应用
查看>>
React入门小记
查看>>
有关二维码防封的问题的解决办法
查看>>
iOS 内存字节对齐
查看>>
Leetcode 611 javascript Valid Triangle Number
查看>>
ES6新特性总结之函数和扩展运算符...
查看>>
[译] Android 生命周期备忘录 — 第三部分:Fragments
查看>>
UICollectionView(集合视图学习笔记)
查看>>