网络流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 ...
随机推荐
- libevent核心-event和event_base结构体
参考:http://blog.csdn.net/yusiguyuan/article/category/2171081/2 http://blog.csdn.net/sparkliang/articl ...
- 【转】python通过文件头判断文件类型
刚刚看到一个好玩的程序,拉过来.原文地址:https://www.ttlsa.com/python/determine-file-type-by-the-file-header/ 侵权删. ===== ...
- android开发者您还在为模拟器犯愁吗?神级android模拟器---Genymotion一个更快、接近完美的模拟器……
摘要:Android系统非常特别,App须要进行模拟化測试.即使这样仍然有解决的办法---虚拟化技术. 之前的模拟器比方eclipse自带的是非常慢的一种,并且模拟器的版本号并非最新的.开机.能够说差 ...
- ecshop 名词
分单:一个订单生成发货单后就会显示已分单,部分发货就会显示部分分单 待发货:已确认已付款未发货 待支付:已分单,未付款,已发货 未确认:未确认,未付款,未发货 已成交:已分单,已付款,已发货 订单状态 ...
- Linux总结(十二)set_uid set_gid stic_bit 软链接 硬链接
一 set_uid 之前我们修改普通用户的登陆密码,都是以管理员身份在操作,比如我们在lv账户下,我们使用sudo passwd lv 重置lv账户密码,此时我们直接拿到root权限忽略掉了文件权限的 ...
- jar包解压
jar -xvf project.jar 解压到当前文件夹
- 使用C#的AssemblyResolve事件和TypeResolve事件动态解析加载失败的程序集
我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...
- 系统优化怎么做-JVM优化之开篇
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...
- 一点一点看JDK源码(四)java.util.ArrayList 中篇
一点一点看JDK源码(四)java.util.ArrayList 中篇 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 在前篇中 ...
- Codeforces Round #483 (Div. 2)C题
C. Finite or not? time limit per test 1 second memory limit per test 256 megabytes input standard in ...