自行理解的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. Python-OpenCV中的filter2D()函数

    使用自定义内核对图像进行卷积.该功能将任意线性滤波器应用于图像.支持就地操作.当光圈部分位于图像外部时,该功能会根据指定的边框模式插入异常像素值. 语法 函数原型: dst=cv.filter2D(s ...

  2. Spark 集群环境搭建

    思路: ①先在主机s0上安装Scala和Spark,然后复制到其它两台主机s1.s2 ②分别配置三台主机环境变量,并使用source命令使之立即生效 主机映射信息如下: 192.168.32.100 ...

  3. MVCPager学习小记

    1.PageIndexParameterName怎么关联? 答:其实就是Action里面的pageindex参数 例子: @Html.Pager(Model, new PagerOptions { P ...

  4. SQL Server 游标的应用

    ----------------SQL游标应用----------------- 今天由于业务需求,需要在存储过程中实现有一个表的主键去匹配在另一个表中作为外键所对应的数值 ,若在C#中则非常简单只需 ...

  5. json_decode()和json_encode()区别----2015-0929

    json_decode对JSON格式的字符串进行编码而json_encode对变量进行 JSON 编码,需要的朋友可以参考下   1.json_decode() json_decode (PHP 5 ...

  6. 51nod——2502最多分成多少块

    数据范围好小... 题目中没说要升序降序,不过样例解释里可以看出是要升序. #include <bits/stdc++.h> using namespace std; ],b[],visi ...

  7. 【dp】守望者的逃离

    妙 题目描述 恶魔猎手尤迪安野心勃勃,他背着了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快 ...

  8. 记一次低级错误导致的mysql(111)

    今天下午配好的双主多从服务器,两台主机+主机内安装好的6台虚拟机,两台Mysql master各授权好其slave的远程登录,原本好端端的能远程登录,晚上回来时候就发现其中一台master登录不上其s ...

  9. 收集的免费API接口

    1.IP地址调用接口 这是淘宝的IP调用API http://ip.taobao.com/service/getIpInfo.php?ip=$ip 返回值:{"code":0,&q ...

  10. Python9-进程-day36

    import osfrom multiprocessing import Processimport timedef func(args,args2): print(args,args2) time. ...