欢迎访问~原文出处——博客园-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. Python学习 --- 列表

    list 函数可以将 序列变为列表 列表操作: 1 . 元素赋值, 根据索引,可以直接修改 2 . 删除元素, del x[i] 3 . 分片赋值, name[1:] = list (' '), 可以 ...

  2. 前端 -----02 body标签中相关标签

    今日内容: 字体标签: h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub> ...

  3. python 基础 列表

    1.列表list()方法用于将元组转换为列表,[]组成,中间可以放很多内容,每一项使用逗号隔开,列表中可以放置任何数据类型的数据.注:元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放括号 ...

  4. CURL错误代码及含义

    https://curl.haxx.se/libcurl/c/libcurl-errors.html NAME libcurl-errors - error codes in libcurl DESC ...

  5. 查看mysql库中所有表的信息--INFORMATION_SCHEMA

    第一个查询看看库里有多少个表,表名等select * from INFORMATION_SCHEMA.TABLES information_schema这张数据表保存了MySQL服务器所有数据库的信息 ...

  6. Linux下Oracle 12c的卸载

    注:本文来源于:<Linux下Oracle 12c的卸载> 与Windows下Oracle的安装容易卸载麻烦相反,Linux下Oracle的安装麻烦下载简单. 1.关闭Oracle数据库 ...

  7. sublime c++

    install: sudo add-apt-repository ppa:webupd8team/sublime-text-3   sudo apt-get update sudo apt-get i ...

  8. jquery 获取和设置 select下拉框的值

    获取Select : 获取select 选中的 text : $("#ddlRegType").find("option:selected").text(); ...

  9. 整合Flask中的目录结构

    一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...

  10. LeetCode(81): 搜索旋转排序数组 II

    Medium! 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给 ...