博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dinic
阅读量:4677 次
发布时间:2019-06-09

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

本人很懒,半年前看的DINIC算法,也明白了其中的原理,但一直没有尝试。今天第一次,参照了其他人的模版。

DINIC优缺点:最大流算法,时间N*N*M,非递归算法更好理解,也更快,但是代码更长!

DINIC思想:通过广搜给每的个结点分层,通过深搜给找一条可以流到终点的流(只搜深度大1的点),统计这条流上的最小边(剩余的可行流)和这条边的起点,流上的最条边减最小边的权,反边加最小边的权,再从第一个最小边的起点再进行深搜(快的重要原因)。直到无法分层。

题目:codevs1993

题目描述 
Description

在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。

农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。

根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。

输入描述 
Input Description

第1行: 两个用空格分开的整数N (0 <= N <= 200) 和 M (2 <= M <= 200)。N是农夫John已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。

第二行到第N+1行: 每行有三个整数,Si, Ei, 和 Ci。Si 和 Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向Ei。Ci (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。

输出描述 
Output Description

输出一个整数,即排水的最大流量。

样例输入 
Sample Input
5 41 2 401 4 202 4 202 3 303 4 10
样例输出 
Sample Output

50

1 #include
2 #include
3 #include
4 #include
5 #include
6 7 using namespace std; 8 const int inf=0x7fffffff; 9 int n,m; 10 int map[205][205]={
0}; 11 int lays[205]; 12 bool vis[205]; 13 bool bfs() 14 { 15 queue
q; 16 memset(lays,-1,sizeof(lays)); 17 lays[1]=0; 18 q.push(1); 19 while(!q.empty()) 20 { 21 int u=q.front(); 22 q.pop(); 23 for(int i=1;i<=m;i++) 24 { 25 if(map[u][i]>0&&lays[i]==-1) 26 { 27 lays[i]=lays[u]+1; 28 if(i==m)return 1; 29 else q.push(i); 30 } 31 } 32 } 33 return 0; 34 } 35 int dinic() 36 { 37 int maxf=0; 38 vector
q; 39 while(bfs()) 40 { 41 q.push_back(1); 42 memset(vis,0,sizeof(vis)); 43 vis[1]=1; 44 while(!q.empty()) 45 { 46 int nd=q.back(); 47 if(nd==m) 48 { 49 int minn,minx=inf; 50 for(int i=1;i
0&&map[u][v]
0&&lays[i]==lays[nd]+1&&!vis[i]) 78 { 79 vis[i]=1; 80 q.push_back(i); 81 break; 82 } 83 } 84 if(i>m)q.pop_back(); 85 } 86 } 87 } 88 return maxf; 89 } 90 int main() 91 { 92 cin>>n>>m; 93 for(int i=0;i

 

转载于:https://www.cnblogs.com/gryzy/p/5826790.html

你可能感兴趣的文章
学前班
查看>>
手把手教您扩展虚拟内存
查看>>
android-samples-mvp
查看>>
oracle 11g r2安装
查看>>
关于自关联1
查看>>
存储控制器、MMU、flash控制器介绍
查看>>
hdu-1814(2-sat)
查看>>
自我反省
查看>>
反射,得到Type引用的三种方式
查看>>
pl sql练习(2)
查看>>
Problem B: 判断回文字符串
查看>>
谷歌浏览器,添加默认搜索引擎的搜索地址
查看>>
数据结构化与保存
查看>>
C# .net 获取程序运行的路径的几种方法
查看>>
为什么需要Docker?
查看>>
国内5家云服务厂商 HTTPS 安全性测试横向对比
查看>>
how to control project
查看>>
转 python新手容易犯的6个错误
查看>>
第四节 -- 列表
查看>>
决策树
查看>>