网络流的$\mathfrak{Dinic}$算法
网络流想必大家都知道,在这不过多赘述。网络流中有一类问题是让你求最大流,关于这个问题,许多计算机学家给出了许多不同的算法,在这里——正如标题所说——我们只介绍其中的一种——\(\tt{Dinic}\)
Dinic是最大流算法中综合性能比较好的一个算法,它的思想继承\(Ford-Fulkerson\)算法,但对FF算法有了很大的一个改进。Dinic通过分层图大大提高了算法效率,减少了许多不必要的搜索。
例题
- Luogu P3376 【模板】网络最大流
正如题目所说,板子题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct zzz{
int t,len,nex;
}e[100010<<2]; int head[10010],tot=1;
void add(int x,int y,int z){
e[++tot].t=y;
e[tot].len=z;
e[tot].nex=head[x];
head[x]=tot;
}
int vis[10010],s,t;
//每次搜索前跑一遍分层图
bool bfs(){
queue <int> q;
memset(vis,0,sizeof(vis));
q.push(s); vis[s]=1;
while(!q.empty()){
int k=q.front(); q.pop();
for(int i=head[k];i;i=e[i].nex){
int to=e[i].t;
if(!vis[to]&&e[i].len){
q.push(to);
vis[to]=vis[k]+1;
if(to==t) return 1;
}
}
}
return vis[t];
}
//寻找增广路径
int dfs(int from,int flow){
if(from==t||!flow) return flow;
int rest=0,fl;
for(int i=head[from];i;i=e[i].nex){
int to=e[i].t;
if(vis[to]==vis[from]+1&&(fl=dfs(to,min(flow-rest,e[i].len)))){
e[i].len-=fl;
e[i^1].len+=fl;
rest+=fl;
if(rest==flow) return flow;
}
}
if(rest<flow)
vis[from]=0;
return rest;
}
//dinic
int dinic(){
int ans=0;
while(bfs())
ans+=dfs(s,0x7ffffff);
return ans;
}
inline int read()
{
int k=0; char c=getchar();
for(;c<'0'||c>'9';) c=getchar();
for(;c>='0'&&c<='9';c=getchar())
k=(k<<3)+(k<<1)+c-48;
return k;
}
int main(){
int n=read(),m=read();
s=read(),t=read();
for(int i=1;i<=m;i++){
int x=read(),y=read(),z=read();
add(x,y,z); add(y,x,0);
}
printf("%d",dinic());
return 0;
}
网络流的$\mathfrak{Dinic}$算法的更多相关文章
- 网络流-最大流问题 ISAP 算法解释(转自Renfei Song's Blog)
网络流-最大流问题 ISAP 算法解释 August 7, 2013 / 编程指南 ISAP 是图论求最大流的算法之一,它很好的平衡了运行时间和程序复杂度之间的关系,因此非常常用. 约定 我们使用邻接 ...
- HDU3549 Flow Problem(网络流增广路算法)
题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...
- POJ 2455 网络流 基础题 二分+网络流 dicnic 以及 sap算法
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8189 Accepted: ...
- 网络流入门--最大流算法Dicnic 算法
感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有向图一张. ...
- 网络流之最大流算法(EK算法和Dinc算法)
最大流 网络流的定义: 在一个网络(有流量)中有两个特殊的点,一个是网络的源点(s),流量只出不进,一个是网络的汇点(t),流量只进不出. 最大流:就是求s-->t的最大流量 假设 u,v 两个 ...
- (通俗易懂小白入门)网络流最大流——EK算法
网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...
- 网络流(2)——用Ford-Fullkerson算法寻找最大流
寻找最大流 在大规模战争中,后勤补给是重中之重,为了尽最大可能满足前线的物资消耗,后勤部队必然要充分利用每条运输网,这正好可以用最大流模型解决.如何寻找一个复杂网络上的最大流呢? 直觉上的方案 一种直 ...
- 网络流最大流——dinic算法
前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...
- 初探网络流:dinic/EK算法学习笔记
前记 这些是初一暑假的事: "都快初二了,连网络流都不会,你好菜啊!!!" from 某机房大佬 to 蒟蒻我. flag:--NOIP后要学网络流 咕咕咕------------ ...
随机推荐
- git commit 提交不了 error: pathspec 'project'' did not match any file(s) known to git.
1. 问题--使用git将代码提交到码云,使用到以下命令时: git commit -m 'init project' # 报错 error: pathspec 'project'' did not ...
- 2012 Noip提高组 Day2
1265. [NOIP2012] 同余方程 ★☆ 输入文件:mod.in 输出文件:mod.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 求关于 x 的同余方 ...
- react native的Navigator组件示例
import React, {Component} from 'react';import {ScrollView, StyleSheet, Text, View, PixelRatio} from ...
- 集成Activiti工作流的J2EE快速开发框架
框架简介 enos款快速开发模块化脚手架,实现功能有系统模块:菜单管理.用户管理.角色管理,系统监控:系统日志.接口api.sql监控. 系统功能 系统管理:菜单管理.用户管理.角色管理 统一查询 p ...
- mysql驱动包下载
- Python-4-设置字符串的格式字符串
字符串是不可变的,所有元素赋值和切片赋值都是非法的 1.替换字段名 可以按顺序和名称匹配 >>> "{foo} {} {bar} {}".format(1, ...
- java快速排序代码
public class test1 { public static int partition(int[] array,int lo,int hi){ int key=array[lo]; whil ...
- [Chrome](CSS) 解决Chrome font-size 小于 12px 无效
Chrome中 font-size 小于 12px 会失效. 解决的办法一种是: -webkit-text-size-adjust:none; (但是Chrome27之后取消了支持) 利用CSS3的缩 ...
- python之 __getattr__、__getattr__、__getitem__、__setitem__ 使用
python之 __getattr__.__getattr__.__getitem__.__setitem__ 使用 __getattr__内置使用点号获取实例属性属性如 s.name,自调用__ge ...
- DDX_Text详细用法
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, BYTE& value ); void AFXAPI DDX_Text( CDataEx ...