感谢这位大佬的博客:https://www.cnblogs.com/SYCstudio/p/7260613.html 给予了我莫大的帮助!

主要说一下网络流的几个注意点:

1.和二分图匹配相似,无法继续增广的网络流即为最大流,但可能因为增广顺序,之前增广的边导致后面更多的边无法增广,所以要允许反悔,即增广之后连反向边

2.因为在增广时可能同一条边来回被增广很多次,所以可能会因为边权差距太大而被卡死,所以要dinic优化分层图查找

3.没有当前弧优化的Dinic是很慢的。。。就是用邻接表记录对于x节点已经“消耗”到哪一条边了

废话不多说,附上代码:

#include <bits/stdc++.h>
using namespace std;
const int N=;
const int inf=(int)2e9; int n,m,s,t;
int e,first[N],nxt[N],point[N],w[N],cur[N];
void add(int x,int y,int z)
{
e++;
point[e]=y;
nxt[e]=first[x];
first[x]=e;
w[e]=z;
} void add_edge(int x,int y,int z)
{
add(x,y,z);
add(y,x,);
} void init()
{
e=-;
memset(first,-,sizeof(first));
memset(nxt,-,sizeof(nxt));
} int depth[N];
bool bfs()
{
memset(depth,,sizeof(depth));
queue<int> q;
while(!q.empty()) q.pop();
q.push(s); depth[s]=;
while(!q.empty())
{
int u=q.front(); q.pop();
for(int i=first[u];i!=-;i=nxt[i])
{
int v=point[i];
if(depth[v]||!w[i]) continue;
depth[v]=depth[u]+;
q.push(v);
}
}
if(depth[t]>) return ;
return ;
} int dfs(int u,int flows)
{
if(u==t) return flows;
for(int& i=cur[u];i!=-;i=nxt[i])
{
int v=point[i];
if(w[i]!=&&depth[v]==depth[u]+)
{
int d=dfs(v,min(w[i],flows));
if(d)
{
w[i]-=d;
w[i^]+=d;
return d;
}
}
}
return ;
} int Dinic()
{
int ans=;
while(bfs())
{
for(int i=;i<=n;i++) cur[i]=first[i];
while(int d=dfs(s,inf))
{
ans+=d;
}
}
return ans;
} int main() {
int T; cin>>T;
for(int iii=;iii<=T;iii++)
{
init();
scanf("%d%d",&n,&m);
s=; t=n;
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
}
printf("Case %d: %d\n",iii,Dinic());
}
return ;
}

模板——网络流Dinic的更多相关文章

  1. 模板-网络流-Dinic

    //Dinic struct Edge{ int from,to,cap,flow; Edge(){ } Edge(int a,int b,int c,int d){ from=a; to=b; ca ...

  2. POJ 1273 Drainage Ditches (网络流Dinic模板)

    Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...

  3. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  4. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  5. POJ 3281 [网络流dinic算法模板]

    题意: 农场主有f种食物,d种饮料,n头牛. 接下来的n行每行第一个数代表第i头牛喜欢吃的食物数量,和第i头牛喜欢喝的饮料数目. 接下来分别是喜欢的食物和饮料的编号. 求解:农场主最多能保证几头牛同时 ...

  6. 网络流dinic ek模板 poj1273

    这里只是用来存放模板,几乎没有讲解,要看讲解网上应该很多吧…… ek bfs不停寻找增广路到找不到为止,找到终点时用pre回溯,O(VE^2) #include<cstdio> #incl ...

  7. Power Network POJ - 1459 网络流 DInic 模板

    #include<cstring> #include<cstdio> #define FOR(i,f_start,f_end) for(int i=f_startl;i< ...

  8. 网络流Dinic模板

    #include <iostream> #include <cstdio> #include <cstring> #include <queue> #d ...

  9. 网络流dinic模板,邻接矩阵+链式前向星

    //这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...

随机推荐

  1. hadoop系列(一)window10下hadoop安装

    风闻win10不需要cygwin就能用hadoop了,赶紧试试. 去官网下载hadoop-2.8.3,然后去 https://github.com/steveloughran/winutils 下载h ...

  2. go 函数和流程控制

    if/else分支判断 基本结构如下: if condition1 { } if condition1 { } else { } if condition1 { } else if condition ...

  3. c++隐藏运行exe黑窗口

    加入main方法隐藏窗口 HWND hwndDOS = GetForegroundWindow(); ShowWindow(hwndDOS, SW_HIDE);

  4. 和Excel函数date同样功能的VBA函数DateSerial用法

    Sub 日期别()On Error Resume Nextlastrow = Sheets("运营日报").Range("a1048576").End(xlUp ...

  5. 人脸识别--Open set和Close set的区别

    训练和测试人脸识别分类器时,总会提到Open-set和Close-set.这俩词到底是什么概念呢?有什么区别呢? 所谓close-set,就是所有的测试集都在训练集中出现过.所以每次的预测直接得出测试 ...

  6. Vultr IP被墙该怎么办

    我们创建好Vultr服务器时候,首先需要检测IP地址是否可用,很多IP在国内被墙,导致使用Xshell连接不上,虽然IP能够ping通,但是SSH依然连接不上.那Vultr IP被墙该怎么办呢? 方法 ...

  7. Erlang学习记录:运算符

    数学运算符 说明 详细 符号 加减乘 +-* 浮点数除 结果为浮点数 / 整数除 除数和被除数都必须是整数,结果为整数 div 整数取余 rem 逻辑运算符 说明 符号 详细 and 前后两个值都为真 ...

  8. R语言 循环

    R语言循环 可能有一种情况,当你需要执行一段代码几次. 通常,顺序执行语句. 首先执行函数中的第一个语句,然后执行第二个语句,依此类推. 编程语言提供允许更复杂的执行路径的各种控制结构. 循环语句允许 ...

  9. Orika JavaBean映射工具探秘

    Orika是一个简单.快速的JavaBean拷贝框架,Orika使用字节代码生成来创建具有最小开销的快速映射器. 关于: 作为开发人员,我们必须为业务问题提供解决方案,我们希望利用我们的时间来做真正重 ...

  10. MySql学习笔记(一)之DQL常用查询

    MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前, ...