自行理解的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. 2018.4.21 如何正确快速安装/卸载云服务器Centos7安装GUI图形化界面GNOME桌面环境

    为云服务哦Centos安装图形化界面GNOME .KDE 1.开始前先验证一下能不能上网 ping www.baidu.com 2.接下来开始安装X(X Window System),命令为 yum ...

  2. 2018.2.25 关于JavaScript

    关于JavaScript 1.数组的归约函数reduce(function(PREV,CUR,I){})会从做导游进行迭代,每次返回的值为下一次的prev参数. 2.在循环遍历数组时若是想在找到结果后 ...

  3. CPP-网络/通信:gsoap 的教程和使用

    1.1.1     gSOAP 1.1.1 .1      简介 gSOAP 编译工具提供了一个 SOAP/XML 关于 C/C++ 语言的实现,从而让 C/C++ 语言研发 web 服务或客户端程式 ...

  4. 在Python中使用help帮助

    在Python中使用help帮助 >>> import numpy >>> help(numpy.argsort) Help on function argsort ...

  5. flowvisor连接ovs

    1 开启flowvisor $ sudo -u flowvisor fvconfig generate /etc/flowvisor/config.json $ sudo /etc/init.d/fl ...

  6. java 第11次作业:你能看懂就说明你理解了——this关键字

    this 代表当前对象

  7. cesium 基于天地图服务 完成底图标注渲染加切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. LeetCode(129) Sum Root to Leaf Numbers

    题目 Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a num ...

  9. nordic芯片开发——烧写方法记录

    在开发nordic芯片的时候,分为存外设开发和结合softdevice开发,另外还有结合mbr的开发(这个暂时没有深究)在裸机开发的时候,sdk里面称为blank,把芯片的程序erase之后,直接下载 ...

  10. 思维水题:UVa512-Spreadsheet Tracking

    Spreadsheet Tracking Data in spreadsheets are stored in cells, which are organized in rows (r) and c ...