P3376 【模板】网络最大流

题目描述

如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。

输入输出格式

输入格式:

第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。

接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)

输出格式:

一行,包含一个正整数,即为该网络的最大流。

输入输出样例

输入样例#1:

4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40
输出样例#1:

50

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=10,M<=25

对于70%的数据:N<=200,M<=1000

对于100%的数据:N<=10000,M<=100000

样例说明:

题目中存在3条路径:

4-->2-->3,该路线可通过20的流量

4-->3,可通过20的流量

4-->2-->1-->3,可通过10的流量(边4-->2之前已经耗费了20的流量)

故流量总计20+20+10=50。输出50。

分析

dinic算法,需要注意许多点:

  • 反向边初始值容量为0,
  • 异或符号,x^1,x为偶数+1,奇数-1;所以第一条边为偶数,所以我的第一条边是2,他的反向边是3;
  • 数据范围,这个就不多说了,反向建边,数组大小要乘2

code

 #include<cstdio>
#include<algorithm> using namespace std; const int N = ;
const int INF = 1e9; struct Edge{
int to,c,nxt;
}e[]; int q[],head[N],dis[N],cur[N];
int S,T,n,m,L,R,tot = ; inline char nc() {
static char buf[],*p1 = buf,*p2 = buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2) ? EOF : *p1++;
}
inline int read() {
int x = ,f = ;char ch = nc();
for (; ch<''||ch>''; ch = nc()) if (ch=='-') f = -;
for (; ch>=''&&ch<=''; ch = nc()) x = x * + ch - '';
return x * f;
}
inline void add_edge(int u,int v,int w) {
e[++tot].to = v,e[tot].c = w,e[tot].nxt = head[u],head[u] = tot;
e[++tot].to = u,e[tot].c = ,e[tot].nxt = head[v],head[v] = tot;
}
inline bool bfs() {
for (int i=; i<=n; ++i) {
cur[i] = head[i];dis[i] = -;
}
L = ;R = ;
q[++R] = S;
dis[S] = ;
while (L <= R) {
int u = q[L++];
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to,c = e[i].c;
if (dis[v]==- && c>) {
q[++R] = v;
dis[v] = dis[u] + ;
if (v==T) return true;
}
}
}
return false;
}
int dfs(int u,int flow) {
if (u==T) return flow;
int used = ;
for (int & i=cur[u]; i; i=e[i].nxt) {
int v = e[i].to,c = e[i].c;
if (dis[v]==dis[u]+ && c>) {
int tmp = dfs(v,min(c,flow-used));
if (tmp > ) {
e[i].c -= tmp;e[i^].c += tmp;
used += tmp;
if (used==flow) break;
}
}
}
if (used != flow) dis[u] = -;
return used;
}
inline int dinic() {
int ans = ;
while (bfs())
ans += dfs(S,INF);
return ans;
}
int main() {
n = read(),m = read(),S = read(),T = read();
for (int a,b,c,i=; i<=m; ++i) {
a = read(),b = read(),c = read();
add_edge(a,b,c);
}
printf("%d",dinic());
return ;
}
 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; const int MAXN = ;
const int INF = 1e9; struct Edge{
int to,c,nxt;
Edge(){}
Edge(int tt,int cc,int nn) {to = tt,c = cc,nxt = nn;}
}e[];
queue<int>q; int head[MAXN],dis[MAXN];
int s,t,n,m,tot = ; int read()
{
int x = , f = ;char ch = getchar();
while (ch<''||ch>'') {if (ch=='-') f = -; ch = getchar();}
while (ch>=''&&ch<='') {x = x*+ch-''; ch = getchar();}
return x*f;
}
bool bfs()
{
q.push(s);
memset(dis,-,sizeof(dis));
dis[s] = ;
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i=head[u]; i; i=e[i].nxt)
{
int v = e[i].to;
if (dis[v]==-&&e[i].c>)
{
dis[v] = dis[u]+;
q.push(v);
}
}
}
if (dis[t]!=-) return true;
return false;
}
int dfs(int u,int low)
{
if (u==t) return low;
int w,used = ;
for (int i=head[u]; i; i=e[i].nxt)
{
int v = e[i].to;
if (dis[v]==dis[u]+&&e[i].c>)
{
w = dfs(v,min(low-used,e[i].c));
e[i].c -= w;
e[i^].c += w;
used += w;
if (used==low) return low;
}
}
if (!used) dis[u] = -;
return used;
}
int dinic()
{
int ans = ,t;
while (bfs())
ans += dfs(s,INF);
return ans;
}
int main()
{
n = read();m = read();s = read();t = read();
for (int u,v,w,i=; i<=m; ++i)
{
u = read();v = read();w = read();
e[++tot] = Edge(v,w,head[u]);
head[u] = tot;
e[++tot] = Edge(u,,head[v]);
head[v] = tot;
}
printf("%d",dinic());
return ;
}

很早以前的代码

P3376 【模板】网络最大流dinic算法的更多相关文章

  1. 网络最大流 Dinic算法

    前言 看到网上好多都用的链式前向星,就我在用 \(vector\) 邻接表-- 定义 先来介绍一些相关的定义.(个人理解) 网络 一个网络是一张带权的有向图 \(G=(V,E)\) ,其中每任意一条边 ...

  2. P3376 [模板] 网络最大流

    https://www.luogu.org/blog/ONE-PIECE/wang-lao-liu-jiang-xie-zhi-dinic EK 292ms #include <bits/std ...

  3. 网络最大流Dinic

    1.什么是网络最大流 形象的来说,网络最大流其实就是这样一个生活化的问题:现在有一个由许多水管组成的水流系统,每一根管道都有自己的最大通过水流限制(流量),超过这个限制水管会爆(你麻麻就会来找你喝茶q ...

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

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

  5. POJ 3469.Dual Core CPU 最大流dinic算法模板

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 24830   Accepted: 10756 ...

  6. 求最大流dinic算法模板

    //最短增广路,Dinic算法 struct Edge { int from,to,cap,flow; };//弧度 void AddEdge(int from,int to,int cap) //增 ...

  7. 【洛谷 p3376】模板-网络最大流(图论)

    题目:给出一个网络图,以及其源点和汇点,求出其网络最大流. 解法:网络流Dinic算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #i ...

  8. 网络流最大流——dinic算法

    前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...

  9. 学习笔记 --- 最大流Dinic算法

    为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...

随机推荐

  1. android中开启线程

    其实Android启动线程和JAVA一样有两种方式,一种是直接Thread类的start方法,也就是一般写一个自己的类来继承Thread类.另外一种方式其实和这个差不多啊! 那就是Runnable接口 ...

  2. hibernate课程 初探单表映射2-1 hibernate进阶 本章简介

    本章简介,主要讲5大块的内容 1 hibernate.cfg.xml的配置 2 session 的简介 3 transaction的简介 4 session的详解 5 对象关系映射常用配置

  3. CentOS6.x升级MySQL 5.1到5.6

    有一些虚拟机.云主机提供商仍然使用的是老版本的安装套件.预装的应用软件版本很低.有些IDC使用的云服务器,其中MySQL预装版本为老版本5.1.x.而较新的MySQL 5.6版本在性能.功能.安全性等 ...

  4. 【干货】JavaScript DOM编程艺术学习笔记10-12【完】

    十.用JavaScript实现动画效果 鼠标放到链接上,每次只显示图片的一小部分,加快加载速度. js: function prepareSlideshow(){ //对象检测 if(!documen ...

  5. 软件License设计

    如何保护软件版权,最常用的办法就是设计一套license验证框架. 1.我们的常规需求如下: .可以限制软件只能在一台机器上使用: 目前很多软件都是一机一码的销售,软件换一台机器则不能使用,想要几台机 ...

  6. kubernetes发布解释型语言应用的最佳实践

    说明 k8s在发布编译型语言的应用时,几乎不用多考虑,就会选择将编译好jar/war包(java语言)或者二进制文件(golang/c++)直接打到镜像当中,生成新的应用镜像,然后将镜像推到镜像仓库, ...

  7. php使用GD库实现图片水印和缩略图——封装成类

    学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...

  8. 如何在ABAP Netweaver和CloudFoundry里记录并查看日志

    Netweaver 要记录日志需要有一个checkpoint group,可以自行创建也可以使用标准的.这里我重用标准的group:DEMO_CHECKPOINT_GROUP. tcode SAAB, ...

  9. IOS Modal(切换另外控件器方式)

    ● 除了push之外,还有另外一种控制器的切换方式,那就是Modal ● 任何控制器都能通过Modal的形式展示出来 ● Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止 ...

  10. World Wind Java开发之十五——加载三维模型(转)

    之前的一篇博客是关于加载粗三维模型的,见http://blog.csdn.net/giser_whu/article/details/43452703,这个地方还存在着不能加载纹理的问题,一直没呢解决 ...