最大流当前弧优化Dinic模板
最大流模板:
- 普通最大流
- 无向图限制:将无向图的边拆成2条方向相反的有向边
- 顶点有流量限制:拆成2个点,连接一条容量为点容量限制的边
- 无源汇点有最小流限制的最大流:理解为水管流量形成循环
- 有源汇点的最小流限制的最大流
- 有源汇点的最小流限制的最小流
- 容量为负数:不能直接利用最大流求边权为负数的最小割。不知道怎么具体处理。。。
模板使用Dinic分层算法,使用了当前弧优化,效率还是不错的,使用的是vector存图,如果使用邻接表存图效率应该会更高吧。
但是ispa算法的效率更高,采用了当前弧优化的ispa算法那就更更高的效率了(=^ ^=),但是这个算法目前不会啊。。。
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<set>
- #include<map>
- #include<queue>
- #include<stack>
- #include<vector>
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> P;
- #define PI acos(-1.0)
- const int maxn=1e5+,maxm=1e5+,inf=0x3f3f3f3f,mod=1e9+;
- const ll INF=1e18+;
- struct edge
- {
- int from,to,cap,flow;
- };
- vector<edge>es;
- vector<int>G[maxn];
- bool vis[maxn];
- int dist[maxn];
- int iter[maxn];
- void init(int n)
- {
- for(int i=; i<=n+; i++) G[i].clear();
- es.clear();
- }
- void addedge(int from,int to,int cap)
- {
- es.push_back((edge)
- {
- from,to,cap,
- });
- es.push_back((edge)
- {
- to,from,,
- });
- int x=es.size();
- G[from].push_back(x-);
- G[to].push_back(x-);
- }
- bool BFS(int s,int t)
- {
- memset(vis,,sizeof(vis));
- queue <int> Q;
- vis[s]=;
- dist[s]=;
- Q.push(s);
- while(!Q.empty())
- {
- int u=Q.front();
- Q.pop();
- for (int i=; i<G[u].size(); i++)
- {
- edge &e=es[G[u][i]];
- if (!vis[e.to]&&e.cap>e.flow)
- {
- vis[e.to]=;
- dist[e.to]=dist[u]+;
- Q.push(e.to);
- }
- }
- }
- return vis[t];
- }
- int DFS(int u,int t,int f)
- {
- if(u==t||f==) return f;
- int flow=,d;
- for(int &i=iter[u]; i<G[u].size(); i++)
- {
- edge &e=es[G[u][i]];
- if(dist[u]+==dist[e.to]&&(d=DFS(e.to,t,min(f,e.cap-e.flow)))>)
- {
- e.flow+=d;
- es[G[u][i]^].flow-=d;
- flow+=d;
- f-=d;
- if (f==) break;
- }
- }
- return flow;
- }
- int Maxflow(int s,int t)
- {
- int flow=;
- while(BFS(s,t))
- {
- memset(iter,,sizeof(iter));
- int d=;
- while(d=DFS(s,t,inf)) flow+=d;
- }
- return flow;
- }
- int in[maxn],out[maxn];
- int l[maxn];
- int main()
- {
- int n,m;
- scanf("%d%d",&n,&m);
- /**有源汇点*/
- int s,t;
- scanf("%d%d",&s,&t);
- memset(in,,sizeof(in));
- memset(out,,sizeof(out));
- init(n);
- for (int i=; i<=m; i++)
- {
- int u,v,r;
- scanf("%d %d %d %d",&u,&v,&l[i],&r);
- out[u]+=l[i],in[v]+=l[i];
- addedge(u,v,r-l[i]);
- }
- /**有源汇点有下界*/
- addedge(t,s,inf);
- /**有下界添加新源点0,汇点n+1*/
- int ss=,tt=n+;
- int sum=;
- for(int i=; i<=n; i++)
- {
- if(in[i]>out[i])
- {
- addedge(ss,i,in[i]-out[i]);
- sum+=in[i]-out[i];
- }
- else if(in[i]<out[i])
- addedge(i,tt,out[i]-in[i]);
- }
- /**无下界直接用s,t求最大流*/
- if(Maxflow(ss,tt)!=sum) puts("NO");
- else
- {
- puts("YES");
- /**有源汇点*/
- int ans=-es[*m+].flow;
- es[*m+].flow=;
- es[*m].flow=;
- es[*m].cap=;
- ans+=Maxflow(s,t);///ans-=Maxflow(t,s);///最小流
- printf("%d\n",ans);
- /**无源汇点:可以理解成水管形成循环*/
- for(int i=; i<m*; i+=)
- printf("%d\n",es[i].flow+l[i/+]);///每根水管的流量情况
- }
- return ;
- }
最大流当前弧优化Dinic模板的更多相关文章
- 最大流当前弧优化Dinic分层模板
最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的有向边 顶点有流量限制:拆成2个点,连接一条容量为点容量限制的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环 有源汇点的最 ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
- 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- P3355 骑士共存问题 二分建图 + 当前弧优化dinic
P3355 骑士共存问题 题意: 也是一个棋盘,规则是“马”不能相互打到. 思路: 奇偶点分开,二分图建图,这道题要注意每个点可以跑八个方向,两边都可以跑,所以边 = 20 * n * n. 然后di ...
- BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论
这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...
- P3376 网络流-最大流模板题(Dinic+当前弧优化)
(点击此处查看原题) Dinic算法 Dinic算法相对于EK算法,主要区别在于Dinic算法对图实现了分层,使得我们可以用一次bfs,一次dfs使得多条增广路得到增广 普通的Dinic算法已经可以处 ...
- P3376 网络最大流模板(Dinic + dfs多路增广优化 + 炸点优化 + 当前弧优化)
### P3376 题目链接 ### 这里讲一下三种优化的实现以及正确性. 1.dfs多路增广优化 一般的Dinic算法中是这样的,bfs() 用于标记多条增广路,以至于能一次 bfs() 出多次 d ...
- 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
//非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...
- ARC085E(最小割规划【最大流】,Dinic当前弧优化)
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...
随机推荐
- js中的数组对象排序(方法sort()详细介绍)
定义和用法 sort() 方法用于对数组的元素进行排序. 语法 arrayObject.sort(sortby) 参数sortby:可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意 ...
- redhat 6.8 配置centos6的yum源
1. 检查是否安装yum包[root@node1 rpms]# rpm -qa|grep yum 2. 删除自带的yum包[root@node1 rpms]# rpm -qa|grep yum|xar ...
- Linux中samba服务器的搭建
使用的vmware12虚拟机安装的centos6.8和物理机上的windows10,实现在windows10 上访问CentOs上的samba服务. 一.先查看系统中是否安装有samba服务相关的软件 ...
- 为Windows资源管理器右键菜单添加菜单项
为Windows资源管理器右键菜单添加菜单项 在Windows下命令行用的比较多,经常在资源管理器里翻到某个目录,若想要在此目录下跑命令,只能是打开cmd.exe,然后一路cd才能到达此目录. 每次都 ...
- vue setTimeout用法 jquery滚动到某一个div的底部
//vue 中setTimeOut用法 var $this = this; setTimeout(function(){ $this.goEnd() }, 10); goEnd:function(){ ...
- Java注解--实现动态数据源切换
当一个项目中有多个数据源(也可以是主从库)的时候,我们可以利用注解在mapper接口上标注数据源,从而来实现多个数据源在运行时的动态切换. 实现原理 在Spring 2.0.1中引入了Abstract ...
- java执行程序的内存分析系列专栏二之static变量和方法内存分析
昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...
- 配置SSH无秘钥登录
[hadoop@hadoop01 ~]$ cd .ssh [hadoop@hadoop01 .ssh]$ ls authorized_keys id_rsa id_rsa.pub known_host ...
- visual studio for mac在线安装网络错误
vs2017 for mac 终于出正式版了,兴冲冲的准备摆脱虚拟机. 官网https://www.visualstudio.com/zh-hans/vs/visual-studio-mac/下了安装 ...
- VMware Mac OS中无法找到适应的分辨率的解决办法
使用VMware安装的Mac OS中,有时在显示器的分辨率中的选择项里面,没有对应显示的分辨率可供选择的时候(无法自适应),可以在虚拟机设置里,显示器中修改强制分辨率.修改过后重启虚拟机,就可以有对应 ...