最大流EK和Dinic算法
最大流EK和Dinic算法
EK算法
最朴素的求最大流的算法。
做法:不停的寻找增广路,直到找不到为止
代码如下:
@Frosero
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int cap[202][202],flow[202][202],mf[202],pre[202];
//cap为网络的容量 flow为现在的流量
//mf[i]为原点到点i的最大流量 pre[i]为增广路上i点上一个点
int EK(int s,int t){
memset(flow,0,sizeof(flow));
queue<int>q;
int ans = 0;
while(1){
while(!q.empty()) q.pop(); q.push(s);
memset(mf,0,sizeof(mf));
mf[1] = INF;
while(!q.empty()){
int u = q.front(); q.pop();
for(int i=1;i<=m;i++)if(!mf[i] && flow[u][i] < cap[u][i]){
pre[i] = u;
q.push(i);
mf[i] = min(mf[u],cap[u][i] - flow[u][i]);
}
}
if(mf[t] == 0) break;
ans += mf[t];
for(int i=t;i!=s;i=pre[i]){
flow[pre[i]][i] += mf[t];
flow[i][pre[i]] -= mf[t];
}
}
return ans;
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
memset(cap,0,sizeof(cap));
memset(flow,0,sizeof(flow));
int u,v,w;
while(n--){
scanf("%d %d %d",&u,&v,&w);
cap[u][v] += w;
}
printf("%d\n",EK(1,m));
}
}
Dinic算法
Dinic的优化部分就是给残留网络生成一个层次图,然后尽量的利用层次图后再形成新的层次图。
理论上Dinic和EK算法的时间复杂度差不多,但是事实上Dinic算法要好得多。
代码如下:
@Frosero
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,flow[202][202],cap[202][202];
int dis[202];
//flow为现在的流量 cap为网络的容量
//dis为点的层次
bool bfs(){ //形成层次图
memset(dis,-1,sizeof(dis));
dis[1] = 0;
queue<int>q; q.push(1);
while(!q.empty()){
int u = q.front(); q.pop();
for(int i=1;i<=m;i++)if(dis[i] == -1 && flow[u][i] < cap[u][i]){
dis[i] = dis[u] + 1;
q.push(i);
}
}
if(dis[m] == -1) return false;
else return true;
}
int dfs(int s = 1,int f = INF){ //利用层次图不断寻找增广路
if(s == m || f == 0) return f;
int ans = 0;
for(int i=1;i<=m;i++)if(dis[i] == dis[s] + 1){
int a = dfs(i,min(f,cap[s][i] - flow[s][i]));
if(a == 0) continue;
flow[s][i] += a;
flow[i][s] -= a;
ans += a;
f -= a;
if(f <= 0) break;
}
return ans;
}
int dinic(){ //Dinic主过程
int ans = 0;
while(bfs()){
ans += dfs();
}
return ans;
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){ //本代码假设1为原点 m为汇点
memset(flow,0,sizeof(flow));
memset(cap,0,sizeof(cap));
int u,v,w;
while(n--){
scanf("%d %d %d",&u,&v,&w);
cap[u][v] += w;
}
printf("%d\n",dinic());
}
return 0;
}
最大流EK和Dinic算法的更多相关文章
- POJ1273:Drainage Ditches(最大流入门 EK,dinic算法)
http://poj.org/problem?id=1273 Description Every time it rains on Farmer John's fields, a pond forms ...
- POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]
题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...
- 最大流EK算法/DINIC算法学习
之前一直觉得很难,没学过网络流,毕竟是基础知识现在重新来看. 定义一下网络流问题,就是在一幅有向图中,每条边有两个属性,一个是cap表示容量,一个是flow 表示流过的流量.我们要求解的问题就是从S点 ...
- 网络流入门—用于最大流的Dinic算法
"网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...
- 网络(最大)流初步+二分图初步 (浅谈EK,Dinic, Hungarian method:]
本文中 N为点数,M为边数: EK: (brute_force) : 每次bfs暴力找到一条增广路,更新流量,代码如下 : 时间复杂度:O(NM²): #include<bits/stdc++ ...
- 【最大流之Dinic算法】POJ1273 【 & 当前弧优化 & 】
总评一句:Dinic算法的基本思想比较好理解,就是它的当前弧优化的思想,网上的资料也不多,所以对于当前弧的优化,我还是费了很大的功夫的,现在也一知半解,索性就写一篇博客,来发现自己哪里的算法思想还没理 ...
- HDU1532最大流 Edmonds-Karp,Dinic算法 模板
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Dinic算法----最大流常用算法之一
——没有什么是一个BFS或一个DFS解决不了的:如果有,那就两个一起. 最大流的$EK$算法虽然简单,但时间复杂度是$O(nm^2)$,在竞赛中不太常用. 竞赛中常用的$Dinic$算法和$SAP$, ...
- 最大流——EK算法
一.算法理论 [基本思想] 反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束.在寻找增广路径时,可以用BFS来找,并且更新残留网络的值(涉 ...
随机推荐
- 每天一个Linux命令:rm(5)
rm rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变 注意:使用rm命令要格外小心.因为 ...
- qt学习(三):鼠标图标改变
qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #i ...
- 对于页面上下载pdf或者excel按钮的实现
这个主要是通过 window.open(url + params) url后台给存放的路径,params是参数
- cms网站模板收集
Dedecms模板 1.魔客吧 ----- dedecms .wordpress .discuz.shopnc.ecshop等模板都有 eg: html5绿色响应式企业网页模板 2.绘艺素材 -- ...
- Redis入门很简单之五【Jedis和Spring的整合】
Redis入门很简单之五[Jedis和Spring的整合] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存jedisspring 在上一篇文章中,简单介绍了Jedis的 ...
- ubuntu18.04 点击启动器实现窗口最小化
gsettings set org.gnome.shell.extensions.dash-to-dock click-action 'minimize'
- SQL之in和like的连用实现范围内的模糊查询
我们知道in可以实现一个范围内的查询,like可以实现模糊查询, 如 select *where col like 123%但是我们如果有一列attri,如123,132,165... 我们想实现12 ...
- 【lua学习笔记】——在sublime中配置Lua运行环境
一.让Sublime可以运行lua脚本 打开sublime 选择tools-->Build System-->New Build System 在新出现的文件中输入如下内容: { &q ...
- js实现图片预览、压缩、上传
先看几个对象:Blob.ArrayBuffer.File.fileReader.formData 详细解释请参考:https://www.cnblogs.com/youhong/p/10875190. ...
- 高博SLAM14讲 ch5 点云拼接例程实现与bug处理
一.环境配置,基本库的安装 1.Eigen库 apt-get 安装 2.sophus库 apt-get 安装 3.pcl 点云库 (1)官方预编译版本 sudo apt-get install lib ...