最大流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来找,并且更新残留网络的值(涉 ...
随机推荐
- Cisco基础(二):三层交换vlan间通信、多交换机vlan间通信、三层交换配置路由、RIP动态路由配置、三层交换配置RIP动态路由
一.三层交换vlan间通信 目标: VLAN实现了广播域的隔离,同时也将VLAN间的通信隔离了.三层交换技术使得VLAN间可以通信. 通过三层交换实现VLAN间通信 方案: 为了解决了传统路由器低速. ...
- ecshop整合discuz教程完美教程
所需软件: ecshop安装包: ECShop_V2.7.3_UTF8_release1106.rarucenter安装包: UCenter_1.6.0_SC_UTF8.zipdiscuz! ...
- IDEA入门使用--二
*)IDEA安装和破解:https://www.cnblogs.com/jajian/p/7989032.html 这次我安装的是最新版2019的IDEA *)导入项目时,根据提示,一步步来.其 ...
- 【Java架构:基础技术】一篇文章搞掂:MySQL
数据库优化手段: 1.查看数据库性能参数 2.分析查询语句 3.添加索引 4.使用连接代替子查询 5.优化数据库结构 字段很多的表分解成多个表 经常联合查询的表,建立中间表 冗余字段 优化插入记录的速 ...
- python复制文件到文件夹中
目标:将一张图片复制到一个文件夹下 所有子文件中. import shutil import os #第一部分,准备工作,拼接出要存放的文件夹的路径 file = 'E:/测试/1.jpg' #cur ...
- appium 链接真机
1. 安装驱动 说明:如果驱动装不上,可以使用第三方的工具去安装.(一般来说还是用第三方) 这里推荐锤子科技的HandShaker, 地址:http://www.smartisan.com/apps/ ...
- NIO浅析(二)
一:前言 在(一中了解了NIO中的缓冲区和通道),通过本文章你会了解阻塞和非阻塞,选择器,管道 二:完成NIO通信的三要素 * 1.通道(Channel):负责连接* java.nio.channel ...
- Error configuring application listener of class org.springframework.web.context.
1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor 缺少asm-3.3.jar 2.java.lang.NoClassDe ...
- vue自定义指令clickoutside实现点击其他元素才会触发
clickoutside.js // 代码内容 const clickoutsideContext = '@@clickoutsideContext'; export default { bind(e ...
- 天天用Synchronized,底层原理是个啥?
作者:liuxiaopeng https://www.cnblogs.com/paddix/p/5367116.html Synchronized 的基本使用 Synchronized 的作用主要有三 ...