网络流初步:<最大流>——核心(增广路算法)(模板)
增广路的核心就是引入了反向边,使在进行道路探索选择的时候增加了类似于退路的东西【有一点dp的味道??】
具体操作就是:1、首先使用结构体以及数组链表next[ MAXN ]进行边信息的存储
2、【核心】在存储正向边时,将正向边结构体数组相邻编号的元素存储反向边
【具体操作:如正向边为AA[0],则对应的反向边为AA[1],这样就可以在之后通过异或来对正向边对应的反向边进行更新】【初始时反向边的容量为0】
3、通过dfs进行寻路,寻路过程要用数组记录下来路经过的边的编号,便于在找到终点后遍历找边的最小剩余容量,然后在总流量上加上最小的剩余容量即可
4、【易错】dfs应该写成bool 型的,在找到一条路或找不到路之后直接return【而不是一直dfs到最后】,而且要在主函数中加一个for(;;),在bool dfs 返回值为false时跳出循环即可
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10000+10
#define M 10000+10
#define inf 1e9;
using namespace std;
int head[N],arnum=,used[N],ans,way[M];
struct ss{int next,to,cap;}a[M];
void add(int from,int to,int cap){a[++arnum]=(ss){head[from],to,cap};head[from]=arnum;}
void insert(int u,int v,int cap){add(u,v,cap),add(v,u,);}
int n,m,S,T;
void work(int step)
{
int minn=inf;
for(int i=;i<=step;i++)
minn=min(minn,a[way[i]].cap);
ans+=minn;
for(int i=;i<=step;i++)
{
a[way[i]].cap-=minn;
a[way[i]^].cap+=minn;
}
}
int dfs(int u,int step)
{
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].to;
int cap=a[i].cap;
if(not used[v] and cap>)
{
way[step]=i;
used[v]=;
if(v==T){work(step);return ;}
else if(dfs(v,step+))return ;
}
return ;
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&S,&T);
int u,v,c;
for(int i=;i<=m;i++){scanf("%d%d%d",&u,&v,&c);insert(u,v,c);}
for(;;)
{
memset(used,,sizeof(used));
used[S]=;
if(not dfs(S,))break;
}
printf("%d",ans);
return ;
}
网络流初步:<最大流>——核心(增广路算法)(模板)的更多相关文章
- Power Network (最大流增广路算法模板题)
Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 20754 Accepted: 10872 Description A p ...
- HDU3549 Flow Problem(网络流增广路算法)
题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...
- hdu 3549 Flow Problem【最大流增广路入门模板题】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...
- hdu 3549 Flow Problem(增广路算法)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 模板题,白书上的代码... #include <iostream> #include & ...
- 网络流初步——增广路算法(EK)模板
#include <iostream> #include <queue> #include<string.h> using namespace std; #defi ...
- 网络最大流最短增广路Dinic算法模板
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include ...
- 落谷p3376 最大流EdmondsKarp增广路模板
参考: https://blog.csdn.net/txl199106/article/details/64441994 分析: 该算法是用bfs求出是否有路从s到t, 然后建立反向边(关于反向边), ...
- 网络流——增广路算法(dinic)模板 [BeiJing2006]狼抓兔子
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #in ...
- POJ-1273-Drainage Ditches 朴素增广路
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 70588 Accepted: 2743 ...
随机推荐
- Codeforces 832D - Misha, Grisha and Underground
832D - Misha, Grisha and Underground 思路:lca,求两个最短路的公共长度.公共长度公式为(d(a,b)+d(b,c)-d(a,c))/2. 代码: #includ ...
- 敏感性、特异性、假阳性、假阴性(sensitivity and specificity)
医学.机器学习等等,在统计结果时时长会用到这两个指标来说明数据的特性. 定义 敏感性:在金标准判断有病(阳性)人群中,检测出阳性的几率.真阳性.(检测出确实有病的能力) 特异性:在金标准判断无病(阴性 ...
- android--------自定义Dialog之信息提示
对话框对于应用也是必不可少的一个组件,在Android中也不例外,对话框对于一些提示重要信息,或者一些需要用户额外交互的一些内容很有帮助. 自定义Dialog步骤: 1.主要创建Java类,并继承Di ...
- JS-图片控制-动画管理模块
animateManage.js ;(function(window,document,undefined){ var _aniQueue = [], //动画队列 --- ani:动画,Queue: ...
- 62. 63. Unique Paths 64. Minimum Path Sum
1. A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
- node安装问题
这个是我碰到的 这是解决方法,祝你好运
- C/S架构系统自动化测试入门
所谓C/S架构即Client/Server(客户端/服务器架构).虽然近年来C/S架构产品越来越少,大有被B/S(Browser/Server 浏览器/服务器)架构超越的趋势,但C/S还是有B/S不可 ...
- js日期选择并将日期返回文本框
date.js // JavaScript Document var gMonths=new Array("一月","二月","三月",&q ...
- (C/C++学习笔记) 十. 函数
十. 函数 ● 基本概念 函数 函数定义 function definition: return_type function_name ( parameter list ) { Body of fun ...
- JavaScript事件简述
事件简述 技术一般水平有限,有什么错的地方,望大家指正. 事件是我们平时经常使用,这次就来了解一下事件.首先我们要明确几个概念,JavaScript是单线程,浏览器是多线程的,并不是所有的事件处理函数 ...