欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解

传送门 - POJ

传送门 - CodeVS

题意概括

给出一个图,告诉你边和容量,起点是1,汇点是n,让你求最大流。

题解

  最大流模板题。

  SAP跑一发!

  学习网络流

代码

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+,M=N*;
int n,m;
struct edge{
int x,y,cap,flow,nxt;
// x,y 边的两个节点, cap 容量, flow 流量, nxt 指向 x 的下一条边
};
struct gragh{
int cnt,fst[N],dist[N],s,t,num[N],cur[N],p[N];
int q[N],head,tail;
edge e[M];
void set(int S,int T){//初始化
s=S,t=T,cnt=;
memset(fst,,sizeof fst);
memset(e,,sizeof e);
}
void add(int a,int b,int c){
// 建立正向边,容量为c
cnt++;
e[cnt].x=a,e[cnt].y=b,e[cnt].cap=c,e[cnt].flow=;
e[cnt].nxt=fst[a],fst[a]=cnt;
// 建立反向边,容量为0
cnt++;
e[cnt].x=b,e[cnt].y=a,e[cnt].cap=,e[cnt].flow=;
e[cnt].nxt=fst[b],fst[b]=cnt;
}
void re_bfs(){
memset(dist,-,sizeof dist);
memset(q,,sizeof q);
head=tail=dist[t]=;
q[++tail]=t;
while (head<tail)
for (int x=q[++head],i=fst[x];i;i=e[i].nxt){
int y=e[i].y;
if (e[i].cap==&&dist[y]==-)
q[++tail]=y,dist[y]=dist[x]+;
}
//bfs给所有的节点分层,得到每个点到达汇点的一种路径的边数
//据说可以达到常数级优化的效果
for (int i=;i<=n;i++)
if (dist[i]==-)
dist[i]=n;
}
int Augment(int &point){
int ex_Flow=<<;
for (int i=t;i!=s;i=e[p[i]].x)
if (e[p[i]].cap-e[p[i]].flow<ex_Flow)
ex_Flow=e[p[i]].cap-e[p[i]].flow,point=e[p[i]].x;
for (int i=t;i!=s;i=e[p[i]].x){
e[p[i]].flow+=ex_Flow;
e[p[i]^].flow-=ex_Flow;
}
return ex_Flow;
}
int ISAP(){
int x,y,MaxFlow=;
memset(num,,sizeof num);
for (int i=;i<=n;i++)
cur[i]=fst[i];//保存每个节点增广到的弧,
//作为当前弧优化的重要部分
for (int i=;i<=n;i++)
num[dist[i]]++;//算出每一个层次当前的节点数量
x=s;
while (dist[s]<n){
if (x==t){
MaxFlow+=Augment(x);
continue;
}
bool found=;
for (int i=cur[x];i;i=e[i].nxt){
y=e[i].y;
if (dist[y]+==dist[x]&&e[i].cap>e[i].flow){
p[y]=cur[x]=i,x=y,found=;
break;
}//找到一条可能为增广路的路径
}
if (!found){
int d=n+;
for (int i=fst[x];i;i=e[i].nxt)
if (e[i].cap>e[i].flow)
y=e[i].y,d=min(d,dist[y]+);
if (!(--num[dist[x]]))
return MaxFlow;//传说中的GAP优化
num[dist[x]=d]++;
cur[x]=fst[x];
if (x!=s)
x=e[p[x]].x;
}
}
return MaxFlow;
}
}g;
int main(){
while (~scanf("%d%d",&m,&n)){
g.set(,n);
for (int i=,a,b,c;i<=m;i++)
scanf("%d%d%d",&a,&b,&c),g.add(a,b,c);
g.re_bfs();
printf("%d\n",g.ISAP());
}
return ;
}

POJ1273 USACO 4.2.1 Drainage Ditches CodeVS1993草地排水 网络流 最大流 SAP的更多相关文章

  1. codevs1993 草地排水(最大流)

    1993 草地排水 USACO  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 在农夫约翰的农场上,每逢下雨,Bes ...

  2. codevs1993草地排水(最大流)

    最近学了最大流,于是去codevs找了几道最大流裸题(这是我第一次写网络流). 题目大意:求一个图的最大流(就是这样的裸题) 第一次A网络流的题,发个博客纪念一下. var n,m,i,j,k,h,t ...

  3. USACO Section 4.2 Drainage Ditches(最大流)

    最大流问题.ISAP算法.注意可能会有重边,不过我用的数据结构支持重边.距离d我直接初始化为0,也可以用BFS逆向找一次. -------------------------------------- ...

  4. USACO Section 4.2: Drainage Ditches

    最大流的模板题 /* ID: yingzho1 LANG: C++ TASK: ditch */ #include <iostream> #include <fstream> ...

  5. Drainage Ditches - poj 1273(网络流模板)

    题意:1是源点,m是汇点,求出来最大流量,没什么好说的就是练习最大流的模板题 ************************************************************* ...

  6. POJ 1273 Drainage Ditches【图论,网络流】

    就是普通的网络流问题,想试试新学的dinic算法,这个算法暑假就开始看国家集训队论文了,之前一直都只用没效率的EK算法,真正学会这个算法还是开学后白书上的描述:dinic算法就是不断用BFS构建层次图 ...

  7. 【codevs1993】草地排水(最大流)

    最近学了最大流,于是去codevs找了几道最大流裸题(这是我第一次写网络流). 题目大意:求一个图的最大流(就是这样的裸题) 第一次A网络流的题,发个博客纪念一下. var n,m,i,j,k,h,t ...

  8. 【Codevs1993】草地排水(最大流,Dinic)

    题意:在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水 ...

  9. poj1273 Drainage Ditches Dinic最大流

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 76000   Accepted: 2953 ...

随机推荐

  1. jmeter4.0的汉化

    一,刚刚安装好,我们看到的是这个界面: 二,option-——>choose language -——>Chinese simplified,然后就可以啦!

  2. LVM初级配置

    步骤: 1.将物理硬盘转换成物理卷(PV) 创建PV:pvcreate /dev/vdb 2.将PV添加到卷组中(VG) vgcreate vg0 /dev/vdb 3.创建逻辑卷(LV)并从VG中调 ...

  3. python 启动虚拟环境

    假设你有两个Python项目-A和B,这两个项目都需要使用同一个第三方模块-tensorflow.如果这两个项目使用相同的tensorflow版本,也许不会有什么问题. 但是,当A和B项目使用不同的t ...

  4. web页面乱码,JSP页面编码设置

    解决Web页面访问出现乱码bug,JSP页面首行添加: <%@ page language="java" contentType="text/html; chars ...

  5. 银联支付java版

    注:本文来源于:<  银联支付java版    > 银联支付java版 2016年09月18日 15:55:20 阅读数:2431 首先去银联官网注册测试支付账户   下载对应的demo[ ...

  6. NSLayoutConstraint 使用详解 VFL使用介绍

    注意 使用前必须先取消所有的你想设置View 的 Autoresizing 属性 因为 Autoresizing  Layout不能共存  系统默认是 Autoresizing for v in su ...

  7. js工具库---Lodash

    Lodash是一个一致性.模块化.高性能的 JavaScript 实用工具库 为什么选择 Lodash ? Lodash 通过降低 array.number.objects.string 等等的使用难 ...

  8. 二.Rsync备份服务

    自己动手部署一遍 期中架构-第二章-备份服务笔记====================================================================== 01. 课 ...

  9. Java并发编程基础-ReentrantLock的机制

    同步锁: 我们知道,锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源,在Lock接口出现之前,Java应用程序只能依靠synchronized关键字来实现同步锁 ...

  10. 正则化 L1 L2

    机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1ℓ1-norm和ℓ2ℓ2-norm,中文称作L1正则化和L2正则化,或者L1范数和L2范数. L1正则化和 ...