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 ...
随机推荐
- Swift (if while)
Swift 分支 if if后的括号可以省略 if后只能接bool值 if后的大括号不能省略 let num1 = 3.0 let num2 = 4.0 let bool : Bool = true ...
- [Android]listview recycleview的复用问题
最近解决了几个bug,是关于listview和recycle view中的复用问题的: 为了提高性能,我们使用了viewHolder来减少view的生成,从而提高滑动的性能: 要注意一个很隐蔽 ...
- js简单解密(eval解密)
今天看博客园文章,看到一篇比较好的文章. 今天又学会一招,可以对一些采用eval加密的js进行解密. 打开谷歌或者火狐浏览器,然后按 F12,接着把这代码复制进去, 最后,去掉开头 4 个字母 eva ...
- Extjs4.1中图片数据源
var jdPicStore = Ext.create('Ext.data.Store',{ fields: ['icon','evalValue'], ...
- NuGet学习笔记3——搭建属于自己的NuGet服务器
文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重 ...
- 开启Tomcat 源码调试
开启Tomcat 源码调试 因为工作的原因,需要了解Tomcat整个架构是如何设计的,正如要使用Spring MVC进行Web开发,需要了解Spring是如何设计的一样,有哪些主要的类,分别是用于干什 ...
- 密码校验正则表达式(java 环境)
密码校验需求: 1) 密码控制只能输入字母.数字.特殊符号(~!@#$%^&*()_+[]{}|\;:'",./<>?)2) 长度 6-16 位,必须包括字母.数字.特殊 ...
- iOS UIAlertView添加输入框
这玩意有时不用就忘,还是记录一下吧 添加: UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"新建文件夹" mes ...
- iOS基于MBProgressHUD的二次封装,一行搞定,使用超简单
MBProgressHUD的使用,临时总结了几款最常用的使用场景: 1.提示消息 用法: [YJProgressHUD showMessage:@"显示文字,1s隐藏" inVie ...
- 异常处理try-catch-finally
php5.5新增 Finally模块 try { //好好干,出了问题不要怕,外面有人接应} catch (HttpException $e) { //时刻准备着,处理上面抛出的HTTP问 ...