最大流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 ...
随机推荐
- do_something方法解析
/** * 运行任务 * @param $interval * @return bool */ static public function do_something($interval) { //是 ...
- NGS基础 - 高通量测序原理
NGS基础 - 高通量测序原理 原创: 赑屃 生信宝典 2017-07-23 NGS系列文章包括NGS基础.转录组分析.ChIP-seq分析.DNA甲基化分析.重测序分析五部分内容. NGS基础系列文 ...
- [RF] Robot Framework新手干货(转载)
Robot Framework用法总结 Robot Framework完整流程学习系列一 Robotframework自动化新手常见问题总结--(基础篇)
- Spring 中参数名称解析 - ParameterNameDiscoverer
Spring 中参数名称解析 - ParameterNameDiscoverer Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.ht ...
- Servlet 3.0 规范(二)注解驱动和异步请求
Servlet 3.0 规范(二)注解驱动和异步请求 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 一.Servlet 3.0 组件 Servlet 容器的组件大致 ...
- fastcgi vc6.0demo
#include <WinSock2.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") ty ...
- Java环境编写
首先安装jdk,本系统中jdk安装在D:\jdk:jre安装在D:\Jre: 然后开始配置环境变量: JAVA_HOME:D:\jdk; JRE_HOME:D:\jre; CLASSPATH:.;%J ...
- mysql 表锁进程非常多的情况
今天要说的是mysql 的 MYISAM引擎下的表锁问题. 通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert ...
- 简单实现"Tomcat"
Tomcat的主要功能就是接收客户端的Http请求,然后将请求分发,并且将请求封装,最后返回资源给到客户端.话不多说,开干. 一.实现设计图 (禁止盗图,除非先转支付宝!!!) ...
- FontAwesome 4.7.0 中完整的675个图标样式CSS参考
FontAwesome 4.7.0 中完整的675个图标样式CSS参考 用法:首先引入CSS文件:<link href="https://maxcdn.bootstrapcdn.com ...