题目描述

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

输入

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

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

输出

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

样例输入

4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40

样例输出

50

数据规模:

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

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

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

网络流的模板题。汇总一些增广路算法。(Ford-Fulkerson, Edmond-Karp, Dinic, ISAP)

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std; struct edge {
int to,cap,rev;
}; const int maxn=, INF=0x7F7F7F7F;
int n,m;
vector <edge> G[maxn+]; edge make_edge(int to, int cap, int rev) {
edge x;
x.to=to, x.cap=cap, x.rev=rev;
return x;
} void add_edge(int from, int to, int cap) {
G[from].push_back(make_edge(to,cap,G[to].size()));
G[to].push_back(make_edge(from,,G[from].size()-));
} void init() {
for (int i=; i<=m; i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
}
} namespace Ford_Fulkerson {
bool used[maxn+]; int dfs(int x, int t, int f) {
if (x==t) return f;
used[x]=true;
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (!used[e.to]&&e.cap>) {
int d=dfs(e.to,t,min(f,e.cap));
if (d>) {
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return ;
} int max_flow(int s, int t) {
int flow=;
for(;;) {
memset(used,,sizeof(used));
int f=dfs(s,t,INF);
if (f==) return flow;
flow+=f;
}
}
} namespace Edmond_Karp {
bool vis[maxn+];
int prev[maxn+];
int pree[maxn+]; void bfs(int s) {
memset(vis,,sizeof(vis));
memset(prev,-,sizeof(prev));
memset(pree,-,sizeof(pree));
queue <int> q;
vis[s]=true;
q.push(s); while(!q.empty()) {
int x=q.front();
q.pop();
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&!vis[e.to]) {
prev[e.to]=x;
pree[e.to]=i;
vis[e.to]=true;
q.push(e.to);
}
}
}
} int max_flow(int s, int t) {
int flow=;
for(;;) {
bfs(s);
if (!vis[t]) return flow;
int d=INF;
for (int i=t; prev[i]!=-; i=prev[i])
d=min(d,G[prev[i]][pree[i]].cap);
for (int i=t; prev[i]!=-; i=prev[i]) {
edge &e=G[prev[i]][pree[i]];
e.cap-=d;
G[e.to][e.rev].cap+=d;
}
flow+=d;
}
}
} namespace Dinic {
int level[maxn+];
int iter[maxn+]; void bfs(int s) {
memset(level,-,sizeof(level));
queue <int> q;
level[s]=;
q.push(s); while (!q.empty()) {
int x=q.front();
q.pop();
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&level[e.to]<) {
level[e.to]=level[x]+;
q.push(e.to);
}
}
}
} int dfs(int x, int t, int f) {
if (x==t) return f;
for (int &i=iter[x]; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&level[e.to]>level[x]) {
int d=dfs(e.to,t,min(f,e.cap));
if (d>) {
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return ;
} int max_flow(int s, int t) {
int flow=;
for(;;) {
bfs(s);
if (level[t]<) return flow;
memset(iter,,sizeof(iter));
int f;
while ((f=dfs(s,t,INF))>)
flow+=f;
}
}
} namespace ISAP {
int gap[maxn+];
int iter[maxn+];
int level[maxn+]; void bfs(int t) {
memset(gap,,sizeof(gap));
memset(level,-,sizeof(level));
queue <int> q;
level[t]=;
gap[level[t]]=;
q.push(t); while (!q.empty()) {
int x=q.front();
q.pop();
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (level[e.to]<) {
level[e.to]=level[x]+;
gap[level[e.to]]++;
q.push(e.to);
}
}
}
} int dfs(int x, int s, int t, int f) {
if (x==t) return f;
int flow=;
for (int &i=iter[x]; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&level[x]==level[e.to]+) {
int d=dfs(e.to,s,t,min(f-flow,e.cap));
e.cap-=d;
G[e.to][e.rev].cap+=d;
flow+=d;
if (f==flow) return f;
}
} gap[level[x]]--;
if (gap[level[x]]==)
level[s]=n+;
iter[x]=;
gap[++level[x]]++;
return flow;
} int max_flow(int s, int t) {
int flow=;
bfs(t);
memset(iter,,sizeof(iter));
while (level[s]<=n)
flow+=dfs(s,s,t,INF);
return flow;
}
} int main() {
int s,t;
scanf("%d%d%d%d",&n,&m,&s,&t);
init();
printf("%d\n",ISAP::max_flow(s,t));
return ;
}

洛谷 P3376 【【模板】网络最大流】的更多相关文章

  1. 【最大流ISAP】洛谷P3376模板题

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

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

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

  3. 洛谷P3376【模板】网络最大流 ISAP

    这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...

  4. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  5. 洛谷 P1546 最短网络 Agri-Net

    题目链接 https://www.luogu.org/problemnew/show/P1546 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当 ...

  6. 洛谷P1546 最短网络 Agri-Net(最小生成树,Kruskal)

    洛谷P1546 最短网络 Agri-Net 最小生成树模板题. 直接使用 Kruskal 求解. 复杂度为 \(O(E\log E)\) . #include<stdio.h> #incl ...

  7. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  8. 洛谷 P3376 【模板】网络最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  9. 洛谷——P3376 【模板】网络最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

随机推荐

  1. 意外的php之学习笔记

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gc_gongchao/article/details/37312039     什么是php? ph ...

  2. OC闪屏页尺寸

    1242*2688  828*1972 1125x2436 1242×2208  750×1334 640×960   640×1136 320x480    640x960  640x1136

  3. docker+kibana+filebeat的安装

    安装filebeat服务(在需要收集日志的主机安装filebeat) 下载和安装key文件 rpm --import https://packages.elastic.co/GPG-KEY-elast ...

  4. python使用telnetlib

    python使用telnetlib 1 前言 目前,本篇仅记录前段时间搜索得到的关于python使用Telnet的技术博客,由于受领新任务,未进一步验证和深入研究与应用. 参考链接: python官网 ...

  5. 白话skynet第二篇:skynet的通信调试pack和sprotol

    今天来说说Skynet客户端和服务端网络通信的基础部分. Skynet当前版本.lua是skynet自带的5.3版本. 根据示例,我们可以知道.通信的步骤如下. 客户端按大小端打包成二进制. sock ...

  6. springMVC--XML解析

    一 springMVC 入口 web.xml; DispatcherServlet二 初始化过程 1.寻找init(); 查看DispatcherServlet时候时,继承自servlet,肯定有初始 ...

  7. 检测U盘插入、拨出状态

    头文件 #include <Dbt.h> 关键代码: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LP ...

  8. java消息队列--ActiveMQ

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  9. Yarn 组件的指挥部 – 调度器Scheduler

    linux基础 为hadoop集群的搭建扫清了障碍,也为内存的管理,文件系统的管理扫清了障碍 接着到Hadoop的阶段,首先做集群的安装,深入到使用这两个核心的组件,分布式文件系统HDFS,解决大量数 ...

  10. Redis详解与常见问题解决方案

    Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...