【题目来源】
https://www.acwing.com/problem/content/description/2173/

【问题描述】
给定一个包含 n 个点 m 条边的有向图,并给定每条边的容量,边的容量非负。
图中可能存在重边和自环。求从点 S 到点 T 的最大流。

【输入格式】
第一行包含四个整数 n,m,S,T。
接下来 m 行,每行三个整数 u,v,c,表示从点 u 到点 v 存在一条有向边,容量为 c。
点的编号从 1 到 n。

【输出格式】
输出点 S 到点 T 的最大流。
如果从点 S 无法到达点 T 则输出 0。

【数据范围】
2≤n≤1000,
1≤m≤10000,
0≤c≤10000,
S≠T

【算法分析】
一、链式前向星
由于网络流是有向有权图,因此可以选择链式前向星存图。关于链式前向星的知识点,可详见:
https://blog.csdn.net/hnjzsyjyj/article/details/126474608
https://blog.csdn.net/hnjzsyjyj/article/details/119917795
https://blog.csdn.net/hnjzsyjyj/article/details/126488154

二、异或^运算
首先给出如下的异或^运算的实例。
0^1=1, 1^1=0
2^1=3, 3^1=2
4^1=5,5^1=4
  ……

通过观察,可知x^1^1=x,即对一个数连续执行两次“^1”运算后,便会得到自身。这恰好与网络流中“反向边的反向边等于自身”不谋而合。
因此,在网络流的算法实现中,我们可以利用“^1”运算来表示反向边。

【算法代码】

/* 链式前向星存图
val[idx] 表示第 idx 条边的权值。
e[idx] 表示第 idx 条边的终点。
ne[idx] 表示与第 idx 条边同起点的最近一次被添加的边的编号。
h[a] 表示以结点 a 为起点的最近一次被添加的边的编号。这个表述是在使用 ne[idx]=h[a] 时,也即使用 h[a]=idx++ 更新 h[a] 之前而言的。要特别注意这个语境。
*/#include <bits/stdc++.h>
using namespace std;const int maxn=1010;
const int maxm=20010;
const int inf=0x3f3f3f3f;int n,m,s,t;
int e[maxm],ne[maxm],h[maxn],val[maxm],idx;
int q[maxn],d[maxn],pre[maxm];
bool st[maxn]; //stampvoid add(int u, int v, int w) { //Construct residual networkval[idx]=w,e[idx]=v,ne[idx]=h[u],h[u]=idx++;val[idx]=0,e[idx]=u,ne[idx]=h[v],h[v]=idx++;
}bool bfs() { //Finding the Augmenting Pathmemset(st,0,sizeof st);int head=0;int tail=0;q[0]=s, st[s]=true, d[s]=inf;while(head<=tail) {int u=q[head++];for(int i=h[u]; i!=-1; i=ne[i]) {int j=e[i];if(!st[j] && val[i]) {st[j]=true;pre[j]=i;d[j]=min(d[u],val[i]);if(j==t)return true;q[++tail]=j;}}}return false;
}int EK() {int ans=0;while(bfs()) {ans+=d[t];for(int i=t; i!=s; i=e[pre[i]^1]) {val[pre[i]]-=d[t];val[pre[i]^1]+=d[t];}}return ans;
}int main() {scanf("%d%d%d%d",&n,&m,&s,&t);memset(h,-1,sizeof h);while(m--) {int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);}printf("%d\n",EK());return 0;
}/*
in:
7 14 1 7
1 2 5
1 3 6
1 4 5
2 3 2
2 5 3
3 2 2
3 4 3
3 5 3
3 6 7
4 6 5
5 6 1
6 5 1
5 7 8
6 7 7out:
14
*/

【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/126474608
https://blog.csdn.net/hnjzsyjyj/article/details/119917795
https://blog.csdn.net/hnjzsyjyj/article/details/126488154
https://blog.csdn.net/pspdragon/article/details/78726016

利用EK算法求网络流的最大流相关推荐

  1. 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...

    有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误. 把字符串看成 ...

  2. 利用Kuhn-Munkras算法求最小权值匹配

    本文参考博客: http://blog.csdn.net/zhangpinghao/article/details/12242823(代码参考该博客) http://philoscience.itey ...

  3. [计算机数值分析]利用秦九韶算法求多项式的值

    Spring-_-Bear 的 CSDN 博客导航 例:利用秦九韶算法求 p ( x ) = x 5 − 3 x 4 + 4 x 2 − x + 1 p(x)=x^{5}-3x^{4}+4x^{2}- ...

  4. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  5. 利用回溯算法求马周游问题

    马周游问题描述 对于一个8*8的棋盘,用下列的方式编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...

  6. 利用分治算法求数列的最大子段和C语言,最大子段和(分治法)

    将长度为n的序列L划分成两个子序列,即 L(1,n/2)   和 L(n/2 + 1 , n) 会出现3种情况: ① max{ L(1,n) } =  max{ L(1,n/2)} ② max{  L ...

  7. 网络流问题以及EK算法复杂度分析

    网络流问题以及EK算法复杂度分析 一.网络流算法 通过一个例子引入网络流问题. 现有一个自来水厂要往家里通水,自来水厂用Vs表示,家用Vt表示.从自来水厂到家之间连接了很多水管,并且中途经过很多转接点 ...

  8. 图论 —— 网络流 —— 最大流 —— FF 算法与 EK 算法

    [概述] FF 算法与 EK 算法是求解最大流的一般增广路方法,其时间复杂度均为 O(n*m*m) Ford-Fulkerson 算法是求解最大流的最基础的算法,其核心思想是增广路定理:网络达到最大流 ...

  9. (通俗易懂小白入门)网络流最大流——EK算法

    网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...

最新文章

  1. 【0805作业】模拟多人爬山
  2. Redis 未授权访问漏洞
  3. 使用SAP C4C rule editor动态控制UI上某个按钮是否显示 - SAP Cloud for Customer UI 规则编辑器的使用一例
  4. java中集合选取怎么选_集合中的可选
  5. URAL1815 Farm in San Andreas(费马点,圆圆相交)
  6. 谷爱凌惊“险”一跳,最少价值10个亿!
  7. 评判云服务靠谱程度 -- Coding 安全那些事
  8. 蓝牙模块:详解蓝牙通信模块的使用
  9. 计算机网络笔记(一):网络基本构成
  10. 阿里云盘 手动获取token教程
  11. MAC直接的剪切快捷键
  12. 如何查看docker的版本号是多少
  13. UED设计流程及方法
  14. php发送邮件功能(以QQ邮件为例)
  15. 运放电路的工作原理_一文教你巧识滤波、稳压、比较、运放电路
  16. 电脑插上U盘,无线鼠标无法使用问题解决
  17. 字典 列表和集合习题
  18. 一个资深程序员成功的背后
  19. PIN PUK1
  20. 软件工程师未来展望_对软件开发者平台未来的展望

热门文章

  1. 人大金仓适配mysql和oracle函数适配
  2. 【漏洞通告】Gitlab存在多个高危漏洞
  3. 人工与软件刷流量有什么区别,如何做刷流量效果才最好?
  4. JAVA I/O流 字符流和字节流、节点流和处理流(包装流、过滤流)、缓冲流
  5. 信创云“华山论剑” 五强鼎力谁与争锋?
  6. 三大运营商“下血本”!相约调整4G流量套餐,网友:还是觉得贵
  7. hudson搭建经验总结
  8. 建设工程法规专科【7】
  9. 如何准备将您的 Mac 升级到 macOS Monterey?
  10. Docker安装Mysql8、并打成镜像在其他内网环境部署