自行理解的Dinic 注释即讲解

#include<bits/stdc++.h>
const int maxn=;
using namespace std;
int read()
{
char ch=getchar();int f=,w=;
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch<=''&&ch>=''){w=w*+ch-'';ch=getchar();}
return f*w;
} //读入优化 struct sj{
int next;
int to;
int w; //w是剩余的流量
}a[maxn*];
int head[maxn],size=; //注意size 要赋值为1 否则会死循环
int m,n;
int s,t;
int cent[maxn]; //层数
int ans; void add(int x,int y,int z)
{
a[++size].to=y;
a[size].next=head[x];
head[x]=size;
a[size].w=z;
} //加边 bool bfs()
{
memset(cent,-,sizeof(cent)); //cent 层数先清零
queue <int> q;
q.push(s);
cent[s]=; //起点进栈
while(q.empty()!=)
{
int ks=q.front();
q.pop();
for(int i=head[ks];i;i=a[i].next)
{
int ts=a[i].to;
if(cent[ts]==-&&a[i].w>)
{
q.push(ts);
cent[ts]=cent[ks]+; //层数加1
}
}
}
if(cent[t]<) //如果已经找不到增广路
return ;
return ;
} int dfs(int x,int low) //dfs搜索 参数:当前的点,当前最小的流量
{
if(x==t)return low; //如果已经搜到终点了 就直接返回
int flow=,r; //避免重复流 每次都新定义一个统计的流量 每层都各自求和
for(int i=head[x];i;i=a[i].next)
{
int st=a[i].to;
if((a[i].w>)&&(cent[st]==cent[x]+))
{
r=dfs(st,min(a[i].w,low-flow)); //递归在这里
if(r>)
{
a[i].w-=r; //当前增广路走过的边 残量减掉这么多
a[i^].w+=r; //反向边则加上这么多
flow+=r; //流量加上r 这次找已经流了这么多
}
}
}
return flow; //递归返回时 则返回已经流完的流量
} int main() //主函数
{
n=read();m=read();
s=read();t=read();
for(int i=;i<=m;i++)
{
int x,y,z;
x=read();
y=read();
z=read();
add(x,y,z);
add(y,x,);
} //建立反向边
while(bfs())
{
int row=dfs(s,0x3f3f3f); //row代表这次搜索找到的流量总和
ans+=row;
cout<<row<<endl;
} //还能找到增广路
cout<<ans;
return ;
}

网络流(自行理解的Dinic)的更多相关文章

  1. 网络流之最大流Dinic算法模版

    /* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...

  2. 网络流(四)dinic算法

    传送门: 网络流(一)基础知识篇 网络流(二)最大流的增广路算法 网络流(三)最大流最小割定理 网络流(四)dinic算法 网络流(五)有上下限的最大流 网络流(六)最小费用最大流问题 转自:http ...

  3. 图论4——探索网络流的足迹:Dinic算法

    1. 网络流:定义与简析 1.1 网络流是什么? 网络流是一种"类比水流的解决问题方法,与线性规划密切相关"(语出百度百科). 其实,在信息学竞赛中,简单的网络流并不需要太高深的数 ...

  4. 网络流(最大流-Dinic算法)

    摘自https://www.cnblogs.com/SYCstudio/p/7260613.html 网络流定义 在图论中,网络流(Network flow)是指在一个每条边都有容量(Capacity ...

  5. 网络流_Edmond-Karp算法、Dinic算法

    转载:网络流基础篇——Edmond-Karp算法             BY纳米黑客 网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点. 汇点:另一个点也很特殊, ...

  6. 我爱网络流之最大流Dinic

    直接上大佬博客: Dinic算法详解及实现来自小菲进修中 Dinic算法(研究总结,网络流)来自SYCstudio 模板步骤: 第一步,先bfs把图划分成分成分层图网络 第二步,dfs多次找增广路 当 ...

  7. [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]

    题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...

  8. 网络流之最大流Dinic --- poj 1459

    题目链接 Description A power network consists of nodes (power stations, consumers and dispatchers) conne ...

  9. swift 自行理解

随机推荐

  1. 1066: 输入n个数和输出调整后的n个数

    1066: 输入n个数和输出调整后的n个数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2739  Solved: 1578[Submit][Stat ...

  2. vuePress的使用

    今天来玩一玩vuePress的使用,用markdown来编辑一个页面网站,这里谈论到了简单使用,细节可以去官网上去查看 开始安装 项目依赖 // package.json { "name&q ...

  3. 关于web安全--CSRF和XSS

    CSRF:跨站请求伪造. 攻击原理:一个用户登陆了可信的网站A,身份验证后A会下发一个cookie:此时用户又打开了另一个危险网站B,B引诱用户点击连接(该链接会访问A的接口),由于此时会携带cook ...

  4. HashMap与ArrayMap(和SparseArray)的比较与选择

    HashMap与ArrayMap(和SparseArray)的比较与选择 2017年12月26日 06:04:38 阅读数:61 标签: androidjavahashmaparraymap数据结构 ...

  5. fread()创建文件和file_exists()文件缓存问题

    ①fread('','w')调用当文件不存在时创建文件,其中参数使用了fread('',"w")导致无法创建文件,修改单引号之后操作正常. ②项目当中新建日志文件,需要判断日志文件 ...

  6. Yii2.0 的安装学习

    视频学习地址: 后盾网视频: http://www.houdunren.com/houdunren18_lesson_76?vid=7350 与<Yii框架>不得不说的故事—基础篇 htt ...

  7. Python模块(二)(序列化)

    1. namedtuple 命名元组->类似创建了一个类 from collections import namedtuple p = namedtuple("Point", ...

  8. R-codes-tips

    1. 在shell执行R文件 chmod 0755 file.R Rscript file.R 2.  载入数据 data(dune) 3. attach() 将data.frame添加到R的搜索路径 ...

  9. Counting Cliques HDU - 5952 单向边dfs

    题目:题目链接 思路:这道题vj上Time limit:4000 ms,HDU上Time Limit: 8000/4000 MS (Java/Others),且不考虑oj测评机比现场赛慢很多,但10月 ...

  10. 欧拉函数:HDU3501-Calculation 2

    Calculation 2 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...