网络流Edmonds-Karp算法入门
今天自习课没事干,看书自学了一下网络流中的EK算法。(求最大流)
设s为源点,t为汇点,C为容量矩阵,F为流量矩阵,f为最大流量。
1.初始化F,f
2.用BFS在残量网络中找到一条从s到t的最短增广路T,如果T不存在,算法结束。
最短增广路就是最短路径(s→t)
一边(u,v)被增广完后,在残量网络中就不存在(u,v)这条边,只有(v,u)这条边了。(即不存在(u,v)这条路径)
3.m=min(u,v)∈T{C(u,v)-F(u,v)} (最短增广路径中残量网络中最小的边)
4.f+=m
5.沿着T修改矩阵,对于任意(u,v)∈T,将F(u,v)增加m,F(u,v)减少m
F(u,v)之所以要减少m是因为有可能会出现以下情况:

假设求出增广路径1→2→3→4
但发现其实1→3→4+1→2→4更优
这就需要反向建边
6.repeat 2.
code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define F(i,x,y) for(int i=x;i<=y;i++)
using namespace std; const int MAXN=;
int N,M,a[MAXN][MAXN];
int pre[MAXN],vis[MAXN],l[MAXN],h,t,S,T; int BFS()
{
memset(pre,-,sizeof(pre));
memset(vis,,sizeof(vis));
h=t=;pre[S]=S,vis[S]=;l[++t]=S;
while(h<t){
int P=l[++h];
for(int i=;i<=N;i++){
if(a[P][i]>&&!vis[i]){
vis[i]=;
pre[i]=P;
if(i==T)return true;
l[++t]=i;
}
}
}
return false;
} int EK()
{
int F=,w=2e9;
while(BFS()){
for(int i=T;i!=S;i=pre[i])w=min(w,a[pre[i]][i]);
for(int i=T;i!=S;i=pre[i]){
a[i][pre[i]]+=w;
a[pre[i]][i]-=w;
}
F+=w;
}
return F;
} int main()
{
while(scanf("%d%d%d%d",&N,&M,&S,&T)!=EOF){
memset(a,,sizeof(a));
int u,v,w;
F(i,,M){
scanf("%d%d%d",&u,&v,&w);
a[u][v]+=w;
}
printf("%d\n",EK());
}return ;
}
网络流Edmonds-Karp算法入门的更多相关文章
- 最大流算法之Ford-Fulkerson算法与Edmonds–Karp算法
引子 曾经很多次看过最大流的模板,基础概念什么的也看了很多遍.也曾经用过强者同学的板子,然而却一直不会网络流.虽然曾经尝试过写,然而即使最简单的一种算法也没有写成功过,然后对着强者大神的代码一点一点的 ...
- 网络流(一)——Edmonds Karp算法
首先是一些关于网络流的术语: 源点:即图的起点. 汇点:即图的终点. 容量:有向边(u,v)允许通过的最大流量. 增广路:一条合法的从源点流向汇点的路径. 网络流问题是在图上进行解决的,我们通常可以将 ...
- [知识点]网络流之Dinic算法
// 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html ...
- 【转】 SVM算法入门
课程文本分类project SVM算法入门 转自:http://www.blogjava.net/zhenandaci/category/31868.html (一)SVM的简介 支持向量机(Supp ...
- 三角函数计算,Cordic 算法入门
[-] 三角函数计算Cordic 算法入门 从二分查找法说起 减少乘法运算 消除乘法运算 三角函数计算,Cordic 算法入门 三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来 ...
- 循环冗余校验(CRC)算法入门引导
目录 写给嵌入式程序员的循环冗余校验CRC算法入门引导 前言 从奇偶校验说起 累加和校验 初识 CRC 算法 CRC算法的编程实现 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌 ...
- 【算法入门】广度/宽度优先搜索(BFS)
广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...
- (转)三角函数计算,Cordic 算法入门
由于最近要使用atan2函数,但是时间上消耗比较多,因而网上搜了一下简化的算法. 原帖地址:http://blog.csdn.net/liyuanbhu/article/details/8458769 ...
- hihocoder网络流一·Ford-Fulkerson算法
网络流一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇 ...
- hdu2389二分图之Hopcroft Karp算法
You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
随机推荐
- [零基础学JAVA]Java SE基础部分-01. Java发展及JDK配置
转自:http://redking.blog.51cto.com/27212/114976 重点要会以下两个方面: 1. 抽象类与接口 2. API==>类集 这是两个最重要部分,这两个部分理解 ...
- 转 C++11之std::function和std::bind
std::function是可调用对象的包装器,它最重要的功能是实现延时调用: #include "stdafx.h" #include<iostream>// std ...
- C#配置IIS搭建网站的工具类
public class IISWorker { public static string HostName = "localhost"; /// <summary> ...
- Oracle拆分字符串,字符串分割的函数。
第一种:oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2, --要分割的字符串 av_ ...
- 阅读MySQL文档第21章摘抄
触发程序是与表相关的数据库对象. mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); Query OK, 0 ro ...
- BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- js 关联着数组中追加元素
var arr_data = new Array(); for ( var i in data.data ){ arr_data.push(arr_data[i] = data.data[ i ] ) ...
- 【CSS单位】px、em、rem
1.PX为单位 在Web页面初期制作中,我们都是使用“px”来设置我们的文本,因为他比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,他改变了浏览器的字体大小,这时 ...
- Linux下的压缩解压缩命令
*.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— *.gz ...
- Matplotlib——中级
关于Matplotlib的愚见 初级中,我只是简单介绍了Matplotlib的使用方法,在中级部分,我系统地说一下我总结的内容. 上图是我画的关于Matplotlib几个对象之间的关系图.它们都来自于 ...