感谢这位大佬的博客: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. 各版本IE兼容问题,IE6,IE7,IE8,IE9,IE10,IE11

    在网站开发和学习中,由于各种兼容性问题,让开发者挺烦恼的,我的学员也经常因为兼容问题来找我取经. 事实上,IE给出了解决方案,谷歌给出了解决方案,国内著名网站百度也将这个解决方案应用于IE的兼容性问题 ...

  2. java异常继承何类,运行时异常与一般异常的区别

    一.基本概念 Throwable是所有异常的根,java.lang.ThrowableError是错误,java.lang.ErrorException是异常,java.lang.Exception ...

  3. lds 文件说明

    主要符号说明 OUTPUT_FORMAT(bfdname) 指定输出可执行文件格式. OUTPUT_ARCH(bfdname) 指定输出可执行文件所运行 CPU 平台 ENTRY(symbol) 指定 ...

  4. Window sevice +OWIN+webapi

    webapi正常都托管在iis上,这里引入owin,将其托管在window服务上. 第一步:创建一个服务,这里就不多描述. 第二步:引入OWIN 2.1引入bll 2.2加入api路由配置 publi ...

  5. sql(10) sum

    SUM() 函数SUM 函数返回数值列的总数(总额).SQL SUM() 语法SELECT SUM(column_name) FROM table_name新建表 StudentSS_id Grade ...

  6. 单行文本截断 text-overflow

    div { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

  7. Windows ipconfig

    用法:    ipconfig [/allcompartments] [/? | /all |                                 /renew [adapter] | / ...

  8. Unknown/unsupported SVM type in function 'cv::ml::SVMImpl::checkParams'

    1.在使用PYTHON[Python 3.6.8]训练样本时报错如下: Traceback (most recent call last): File "I:\Eclipse\Python\ ...

  9. 概率dp——逆推期望+循环迭代zoj3329

    首先要推出dp[i]的期望方程,会发现每一项都和dp[0]相关, 那我们将dp[i]设为和dp[0]有关的式子dp[i]=a[i]*dp[0]+b[i],然后再回代到原来的期望方程里 然后进行整理,可 ...

  10. 2428: [HAOI2006]均分数据

    模拟退火.一种十分玄学的随机算法,网上可以查到比较详细的资料. 先随机地把数分成m组,每次随机地选择一个数,一开始直接选最小的一组,后来就随机一组,把这个数换到该组看看答案能不能变小,如果变小则换,如 ...