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 ...
随机推荐
- 获取设备IMEI ,手机名称,系统SDK版本号,系统版本号
1.获取设备IMEI TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Str ...
- C#复习⑥
C#复习⑥ 2016年6月19日 23:46 Main Interfaces & Delegates 接口和委托 1.接口基本语法 public interface IList : IColl ...
- linux 学习随笔-文件目录管理
1:绝对路径:写法一般由'/'根目录引起的 '/'表示根目录 2:相对路径:不是由'/'引起的 需要先进入/ 在进入其它文件 3:mkdir -p +目录+文件夹 可以用于创建不存在的级联目录 不 ...
- Sqlite学习笔记(二)&&性能测试
测试目标 获取SQlite的常规性能指标 测试环境 CPU:8核,Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz 内存:16G 磁盘:SSD Linux 2.6.32 ...
- SQLServer中的死锁的介绍
简介 什么是死锁? 我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放. 什么又是阻塞? 阻塞是 ...
- linux 运维必备150个命令
线上查询及帮助命令(1个) man 目录操作命令(6个) ls tree pwd mkdir rmdir cd 文件操作命令(7个) touch cp mv rm ln find rename 文件查 ...
- ASP.NET Web API 简介
ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RES ...
- 我的ElasticSearch集群部署总结--大数据搜索引擎你不得不知
摘要:世上有三类书籍:1.介绍知识,2.阐述理论,3.工具书:世间也存在两类知识:1.技术,2.思想.以下是我在部署ElasticSearch集群时的经验总结,它们大体属于第一类知识“techknow ...
- android Bitmap类方法属性 详细说明
(转:http://blog.csdn.net/ymangu666/article/details/37729109) 1. BitMap类public void recycle()——回收位图占用 ...
- ResultSet rs = stmt.executeQuery(sql); 返回值问题判断
JAVA ResultSet rs = stmt.executeQuery(sql); //查询返回的结果集不管是否查到,rs都不是null,那么问题是怎么判断查找不到来执行一个提示“账号或者 ...