DINIC网络流+当前弧优化
深搜网络流+当前弧优化
const
inf=;
type
rec=record
s,e,w,next:longint;
end;
var
b,bb,d,q:array[-..] of longint;
a:array[-..] of rec;
n,m,i,j,k,l,st,ed,ww,top,ans,nn,dd,x:longint;
function min(aa,bb:longint):longint;
begin
if aa<bb then exit(aa);exit(bb);
end;
procedure add(st,ed,ww:longint);
begin
inc(top);
a[top].s:=st;
a[top].e:=ed;
a[top].w:=ww;
a[top].next:=b[st];
b[st]:=top;
end;
function addflow(p,maxflow:longint):longint;
var
o,u:longint;
begin
if(p=ed)or(maxflow=)then exit(maxflow);
d[p]:=;
addflow:=; u:=bb[p];
while u> do
begin
if(a[u].w>)and(d[a[u].e]=)then
begin
o:=addflow(a[u].e,min(maxflow,a[u].w));
if o> then
begin
dec(a[u].w,o); if a[u].w> then bb[p]:=u;
inc(a[u xor ].w,o);
dec(maxflow,o); inc(addflow,o);
if maxflow= then break;
end;
end;
u:=a[u].next;
end;
end;
function network:longint;
var i,last:longint;
begin
network:=; last:=;
while true do
begin
for i:=st to ed do begin bb[i]:=b[i]; d[i]:=; end;
inc(network,addflow(st,inf));
if network=last then exit;
last:=network;
end;
end;
begin
readln(n,m);
top:=; build;
writeln(network);
end.
DINIC网络流+当前弧优化
const
inf=;
type
rec=record
s,e,w,next:longint;
end;
var
b,bb,d,q:array[-..] of longint;
a:array[-..] of rec;
n,m,i,j,k,l,st,ed,ww,top,ans,nn,dd,x:longint;
function min(aa,bb:longint):longint;
begin
if aa<bb then exit(aa);exit(bb);
end;
procedure add(st,ed,ww:longint);
begin
inc(top);
a[top].s:=st;
a[top].e:=ed;
a[top].w:=ww;
a[top].next:=b[st];
b[st]:=top;
end;
function bfs:boolean;
var head,tail,x,u,i:longint;
y:rec;
begin
for i:=st to ed do d[i]:=-;
tail:=; head:=; d[st]:=; q[]:=st;
while head<tail do
begin
inc(head); x:=q[head];
u:=b[x];
while u> do
begin
y:=a[u];
if(d[y.e]=-)and(y.w>)then
begin
d[y.e]:=d[x]+;
inc(tail); q[tail]:=y.e;
end;
u:=y.next;
end;
end;
if d[ed]=- then exit(false);
exit(true);
end;
function addflow(p,maxflow:longint):longint;
var
o,u:longint;
begin
if(p=ed)or(maxflow=)then exit(maxflow);
addflow:=; u:=bb[p];
while u> do
begin
if(d[a[u].e]=d[p]+)and(a[u].w>)then
begin
o:=addflow(a[u].e,min(maxflow,a[u].w));
if o> then
begin
dec(a[u].w,o); if a[u].w> then bb[p]:=u;
inc(a[u xor ].w,o);
dec(maxflow,o); inc(addflow,o);
if maxflow= then break;
end;
end;
u:=a[u].next;
end;
if addflow= then d[p]:=-;
end;
function network:longint;
var i:longint;
begin
network:=;
while bfs do
begin
for i:=st to ed do bb[i]:=b[i];
inc(network,addflow(st,inf));
end;
end;
begin
readln(n,m);
top:=; build;
writeln(network);
end.
PASCAL
#include<bits/stdc++.h>
using namespace std;
const int INF=;
int n,m,ss,tt,flow,l,r,lb[];
int c[],c2[],b[][],dis[];
void adedg(int x,int y,int z)
{
m++; b[m][]=z; b[m][]=y; b[m][]=c[x]; c[x]=m;
m++; b[m][]=; b[m][]=x; b[m][]=c[y]; c[y]=m;
}
bool bfs()
{
for(int i=ss;i<=tt;i++)dis[i]=-; dis[ss]=;
l=; r=; lb[r]=ss;
while(l<r)
{
l++; int x=lb[l];
for(int i=c[x];i;i=b[i][])
if((dis[b[i][]]==-)and(b[i][]>))
{ dis[b[i][]]=dis[x]+; r++; lb[r]=b[i][]; }
}
if(dis[tt]!=-)return ;
return ;
}
int work(int x,int ma)
{
if((ma==)or(x==tt))return ma;
int add=;
while(c2[x])
{
int i=c2[x];
if(dis[b[i][]]==dis[x]+)
{
int l=work(b[i][],min(b[i][],ma)); add+=l; ma-=l;
b[i][]-=l; b[i^][]+=l;
if(ma==)return add;
}
c2[x]=b[c2[x]][];
}
return add;
}
int main()
{
m=; build();
flow=;
while(bfs())
{
for(int i=ss;i<=tt;i++)c2[i]=c[i];
flow+=work(ss,INF);
}
printf("%d\n",flow);
}
C++
DINIC网络流+当前弧优化的更多相关文章
- [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]
题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...
- P3376 网络流-最大流模板题(Dinic+当前弧优化)
(点击此处查看原题) Dinic算法 Dinic算法相对于EK算法,主要区别在于Dinic算法对图实现了分层,使得我们可以用一次bfs,一次dfs使得多条增广路得到增广 普通的Dinic算法已经可以处 ...
- 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
//非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...
- 【最大流之Dinic算法】POJ1273 【 & 当前弧优化 & 】
总评一句:Dinic算法的基本思想比较好理解,就是它的当前弧优化的思想,网上的资料也不多,所以对于当前弧的优化,我还是费了很大的功夫的,现在也一知半解,索性就写一篇博客,来发现自己哪里的算法思想还没理 ...
- 最大流Dinic算法的一些优化 [网络流][最大流]
明天省夏要讲网络流啦!晚上翻出自己的模板发现是蓝书模板QwQ..拿出以前的提交代码(AC过的?) 曾经的提交记录 在luogu上重新提交一遍,结果gg...OVO 没有去除多余的inline 去除了多 ...
- 最大流当前弧优化Dinic模板
最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环,每根水管有流量限制,并且流入量等于流出量 有源汇点的最小流限制的最大流 顶 ...
- 最大流当前弧优化Dinic分层模板
最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的有向边 顶点有流量限制:拆成2个点,连接一条容量为点容量限制的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环 有源汇点的最 ...
- ARC085E(最小割规划【最大流】,Dinic当前弧优化)
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...
- 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
随机推荐
- GitHub Android Libraries Top 100 简介
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过 ...
- TFS2012 服务器安装
配置: 华硕Z97-A I7 4790K 2*2T 4*8G 操作系统: Win2012 标准 SN: DBGBW-NPF86-BJVTX-K3WKJ-MTB6V http://dinghuqiang ...
- 表单form的enctype="multipart/form-data"使用疑惑
在使用表单传送数据的时候,如果form 加了enctype="multipart/form-data" 这个属性,那么表单请求传到另一个jsp或servlet 里时是不能用requ ...
- 各类 HTTP 返回状态代码详解
完整版 1**(信息类):表示接收到请求并且继续处理 100——客户必须继续发出请求 101——客户要求服务器根据请求转换HTTP协议版本 2**(响应成功):表示动作被成功接收.理解和接受 200— ...
- Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用
上篇文章Asp.net MVC验证那些事(1)-- 介绍和验证规则使用中,介绍了Asp.net MVC中的验证功能以及如何使用.这里将对MVC中内置的验证规则进行总结. 一,查找所有验证规则 上篇文章 ...
- Apache安装问题:configure: error: APR not found . Please read the documentation
Linux上安装Apache时,编译出现错误: checking for APR... no configure: error: APR not found . Please read the do ...
- Linux简介及常用命令使用2--linux常用命令:查看 删除 编辑 创建等
cd . // 进入当前目录 cd ~ //进入根目录 pwd //当前路径 echo "my name is makaidong">makai ...
- sed入门详解教程
sed是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作.sed本身是一个非常复杂的工具,有专门的书籍讲解sed的具体用法,但是个人觉得没有 ...
- Java调优
Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...
- 在JazzyViewPager中调用其它layout布局xml并使用
开源地址:https://github.com/jfeinstein10/JazzyViewPager 发现网上的例子使用的是直接创建的一个TextView来做的.但是实际上使用,不可能只有这一个控件 ...