网络流——最大流Dinic算法
前言
突然发现到了新的一年什么东西好像就都不会了凉凉
算法步骤
- 建残量网络图
- 在残量网络图上跑增广路
- 重复1直到没有增广路(注意一个残量网络图要尽量把价值都用完,不然会浪费建图的时间)
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=10010,M=100010,Inf=1e9+10;
int n,m,s,t,flow;
class Graph{
private:
int front[N],nxt[M<<1],to[M<<1],w[M<<1],cnt,dep[N];
bool bfs(){
queue<int >Q;while(!Q.empty())Q.pop();
memset(dep,0,sizeof(dep));
Q.push(s);dep[s]=1;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=front[u];i!=-1;i=nxt[i]){
int v=to[i];
if(!dep[v] && w[i]){
dep[v]=dep[u]+1;Q.push(v);
}
}
}
return dep[t];
}
int dfs(int u,int Flow){
if(u==t || !Flow)return Flow;
for(int i=front[u];i!=-1;i=nxt[i]){
int v=to[i];
if(dep[v]==dep[u]+1 && w[i]){
int di=dfs(v,min(Flow,w[i]));
if(di){
w[i]-=di;w[i^1]+=di;
return di;
}
}
}
return 0;
}
public:
void Add(int u,int v,int val){to[cnt]=v;nxt[cnt]=front[u];front[u]=cnt;w[cnt]=val;cnt++;}
void init(){memset(front,-1,sizeof(front));cnt=0;}
void Dinic(){
while(bfs()){
while(int d=dfs(s,Inf)){
flow+=d;
}
}
}
}MaxFlow;
int main(){
n=gi();m=gi();s=gi();t=gi();
MaxFlow.init();
for(int i=1;i<=m;i++){
int u=gi(),v=gi(),val=gi();
MaxFlow.Add(u,v,val);MaxFlow.Add(v,u,0);
}
MaxFlow.Dinic();
printf("%d\n",flow);
return 0;
}
当前弧优化
考虑我们在dfs搜索的时候,是不是有什么东西重复了?
显然搜索过的就不可能再来了(因为已经被压榨干净了)
然后就可以修改一些dfs的过程。
int dfs(int u,int Flow){
if(u==t || !Flow)return Flow;
for(int &i=cur[u];i!=-1;i=nxt[i]){
int v=to[i];
if(dep[v]==dep[u]+1 && w[i]){
int di=dfs(v,min(Flow,w[i]));
if(di){
w[i]-=di;w[i^1]+=di;
return di;
}
}
}
return 0;
}
void Dinic(){
while(bfs()){
for(int i=1;i<=n;i++)cur[i]=front[i];
while(int d=dfs(s,Inf)){
flow+=d;
}
}
}
优化还是比较明显的。
大家可以在看完之后切了这道题目
当然陆续将会推出HLPP与ISAP的总结。
网络流——最大流Dinic算法的更多相关文章
- 网络流最大流——dinic算法
前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...
- [讲解]网络流最大流dinic算法
网络流最大流算法dinic ps:本文章不适合萌新,我写这个主要是为了复习一些细节,概念介绍比较模糊,建议多刷题去理解 例题:codevs草地排水,方格取数 [抒情一下] 虽然老师说这个多半不考,但是 ...
- Power Network(网络流最大流 & dinic算法 + 优化)
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24019 Accepted: 12540 D ...
- 网络流之最大流Dinic算法模版
/* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...
- 网络流(最大流-Dinic算法)
摘自https://www.cnblogs.com/SYCstudio/p/7260613.html 网络流定义 在图论中,网络流(Network flow)是指在一个每条边都有容量(Capacity ...
- 学习笔记 --- 最大流Dinic算法
为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...
- hdu-3572 Task Schedule---最大流判断满流+dinic算法
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...
- 最大流——Dinic算法
前面花了很长时间弄明白了压入-重标记的各种方法,结果号称是O(V3)的算法测demo的时候居然TLE了一个点,看了题解发现所有人都是用Dinic算法写的,但它的复杂度O(V2E)明显高于前者,具体是怎 ...
- 求最大流dinic算法模板
//最短增广路,Dinic算法 struct Edge { int from,to,cap,flow; };//弧度 void AddEdge(int from,int to,int cap) //增 ...
随机推荐
- applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
14:59:16,747 ERROR ContextLoader:350 - Context initialization failedorg.springframework.beans.factor ...
- 【搜索】 Find The Multiple
#include<stdio.h> #include<stdlib.h> #include<string.h> bool found; void DFS(unsig ...
- php结合layui实现前台加后台操作
一:前台加载出前端页面: HTML: lay-data="{width:800,height:400, url:'data.php', page:true, id:'test'} js: l ...
- 2019.01.17 bzoj2333: [SCOI2011]棘手的操作(启发式合并)
传送门 启发式合并菜题. 题意:支持与连通块有关的几种操作. 要求支持连边,单点修改,连通块修改,全局修改和单点查值,连通块查最大值和全局最大值. 我们对每个连通块和答案用可删堆维护最大值,然后用启发 ...
- 2018.11.07 codeforces559C. Gerald and Giant Chess(dp+组合数学)
传送门 令f[i]f[i]f[i]表示对于第iii个棋子,从(1,1)(1,1)(1,1)出发到它不经过其它棋子的方案数. 于是我们假设(h,w)(h,w)(h,w)有一个棋子,求出它的fff值就可以 ...
- Codeforces Round #517 (Div. 2) C. Cram Time(思维+贪心)
https://codeforces.com/contest/1065 题意 给你a,b,让你找尽量多的自然数,使得他们的和<=a,<=b,用在a和b的自然数不能重复 思路 假如只有一个数 ...
- Router types
Inq-n. Flits are stored at the input of the router. Each input unit is connected to the switch by as ...
- s5-13 RIP 为什么会 衰败
DV路由可能遇到的问题 路由环路( routing loop) 计数到无穷问题( Count to infinite) 收敛慢的问题( slow Convergence ) 相信错误的路由信息导致 好 ...
- Altera PLL应用中注意的问题
无论是差分转单端信号还是单端信号转差分信号,都要都要用到altiobuf.而且在pin planner中要设置管脚的标准为差分的 而且要注意管脚的正负极性. 今天用FPGA做测试:把专门用于PLL的输 ...
- AngularJS实战之cookie的读取
<!DOCTYPE html> <html ng-controller="cookies_controller"> <head> <tit ...