最大流Dinic算法
嘿嘿嘿,时隔不久又见到了DInic,再次回顾一下吧
不过这次我倒是不想深究,而是想多做一些题,因为这几次比赛下来,算法不是重点,重点是题目如何转化,算法如何应用,这也是比赛为什么让你带着板子的原因吧,所以算法基本思想掌握了就好,不要去背,一看就能想通就行
Dinic算法通过bfs优先的分层处理,加以当前弧的优化,使得dfs寻找 最大流的更多,不像ff算法dfs效率低下,通过分层使得dfs明确了寻找方向,当前弧的优化,使得dfs寻边效率大大提高
Code
一些基本操作
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#define inf (1 << 28)
using namespace std;
typedef long long ll;
const int maxn = 220;
const int maxm = 4e4 + 4e2;
int n,m;
struct node{
int pre;
int to,cost;
}e[maxm];
int id[maxn],cnt;
//层数
int flor[maxn]; int cur[maxn];//DFS的优化遍历::当前弧优化 void add(int from,int to,int cost)
{
e[cnt].to = to;
e[cnt].cost = cost;
e[cnt].pre = id[from];
id[from] = cnt++;
swap(from,to);
e[cnt].to = to;
e[cnt].cost = 0;
e[cnt].pre = id[from];
id[from] = cnt++;
}
bfs分层处理
其实明白了思路,这个很简单就能写出来
int bfs(int s,int t)
{
memset(flor,0,sizeof(flor));
queue < int > q;
while(q.size())q.pop();
flor[s] = 1;
q.push(s); while(q.size())
{
int now = q.front();
q.pop();
for(int i = id[now];~i;i=e[i].pre)
{
int to = e[i].to;
int cost = e[i].cost;
if(flor[to] == 0 && cost > 0)
{
flor[to] = flor[now] + 1;
q.push(to);
if(to == t)return 1;
}
}
}
return 0;
}
dfs当前弧度的优化
dfs比较难懂,为什么要懂ff就是因为一切的算法都是以简单算法为基础的优化过来的
value:是s - s’的最大流(起始点为s)
ret:s' - t的残流(起始点为s’)
一层一层的递归,value - ret就是最大流了,具体还是理解代码展现出的思想
记得我第一次看的时候,dinic真的好绝望...看了n多篇博客,最后也没有
int dfs(int s,int t,int value)
{
//ret表示目前流到s的最大流量,用来计算回溯的时候是否还有可行流
int ret = value;
if(s == t || value == 0)return value; int a; for(int &i = cur[s];~i;i = e[i].pre)
{
int to = e[i].to;
int cost = e[i].cost;
if(flor[to] == flor[s] + 1 && (a = dfs(to,t,min(ret,cost))))
{
e[i].cost -= a;
e[i^1].cost += a;
ret -= a;
if(ret == 0)break;
}
}
//s点后面没有可行的流了,flor[s] = 0就表示废掉了这个点
if(ret == value) flor[s] = 0;
return value - ret;
}
DInic算法就是基于bfs来dfs的
int dinic(int s,int t)
{
ll ret = 0;
while(bfs(s,t))
{
memcpy(cur,id,sizeof(id));
ret += dfs(s,t,inf);
}
return ret;
}
其他的就简单啦
void init()
{
memset(id,-1,sizeof(id));
cnt = 0;
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
init();
int a,b,x;
for(int i = 1;i <= m;++i)
{
scanf("%d%d%d",&a,&b,&x);
add(a,b,x);
}
ll ret = dinic(1,n);
printf("%lld\n",ret);
}
return 0;
}
最大流Dinic算法的更多相关文章
- 网络流之最大流Dinic算法模版
/* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...
- 学习笔记 --- 最大流Dinic算法
为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...
- Power Network(网络流最大流 & dinic算法 + 优化)
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24019 Accepted: 12540 D ...
- 最大流——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) //增 ...
- POJ 3469.Dual Core CPU 最大流dinic算法模板
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 24830 Accepted: 10756 ...
- hdu-3572 Task Schedule---最大流判断满流+dinic算法
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...
- P3376 【模板】网络最大流dinic算法
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
- 网络流(最大流-Dinic算法)
摘自https://www.cnblogs.com/SYCstudio/p/7260613.html 网络流定义 在图论中,网络流(Network flow)是指在一个每条边都有容量(Capacity ...
随机推荐
- svn冲突问题解决办法
经常有人会说,树冲突是很难解决的一类冲突,其实一旦了解了其原理,要解决也不难.先回顾下对于树冲突的定义. 树冲突:当一名开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行 ...
- c中extern的作用
参考资料: http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
- dbc file
DBC文件是用来描述CAN网络通信信号的一种格式文件.它可以用来监测与分析CAN网络上的报文数据,也可以用来模拟某个CAN节点.(DBC file is a format file used to d ...
- [Robot Framework] 通过SikuliLibrary可以获取到图片,但是点击失效
执行时,可以看到鼠标已经移动到图片上了,但是点击失效,日志也没有报错 后来发现是windows权限的问题. 通过打开Control Panel->System and Security-> ...
- jqgrid子表格
.前台 <%-- builed by manage.aspx.cmt [ver:] at // :: --%> <%@ Page Language="C#" Au ...
- wireshark源码分析二
一.源代码结构 在wireshark源代码根目录下,可以看到以下子目录: 1)物理结构 其中,epan文件夹负责所有网络协议识别工作,plugins里面存放了wireshark所有插件,gtk ...
- spring 学习 一 spring 介绍
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...
- linux_添加一个普通用户
useradd 用户名 passwd 密码 su 用户名 可以切换用户 exit 返回之前登录的用户 sodu用户 --> 不用告诉普通用户root的密码 可以查看所有的系统文件 包括root下 ...
- css中的属性
一.字体 1.字体类型 font-family "Microsoft YaHei","微软雅黑" 2.字体大小 font-size 默认16px 3.字体字重 ...
- centos 7 搭建pip源
一.安装pip2pi工具: pip install pip2pi 或编译: git clone https://github.com/wolever/pip2pi cd pip2pi python s ...