最大流sap
带当前弧优化 gap优化的sap 甚至省去了开始的bfs分层
虽然花了一些时间了解原理 但是感觉不亏 现在能完全独立靠原理写出具体实现了
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = , maxm = , inf = 0x3f3f3f3f;
int st, ed, tot, n, m;
struct Edge{
int u, v, nxt, w, f;
Edge(){}
Edge(int u, int v, int nxt, int w, int f):u(u), v(v), nxt(nxt), w(w), f(f){}
}edge[maxm];
int head[maxn], cur[maxn], gap[maxn], dep[maxn], pre[maxn];
void init(){
tot = ;
memset(head, -, sizeof head);
}
void addedge(int u, int v, int w){
edge[tot] = Edge(u, v, head[u], w, );
head[u] = tot++;
edge[tot] = Edge(v, u, head[v], , );
head[v] = tot++;
}
int sap(){
memset(gap, , sizeof (gap));
memset(dep, , sizeof (dep));
memcpy(cur, head, sizeof (head));
int u = st;
pre[u] = -;
gap[] = n;
int ans = ;
while(dep[st] < n){
if(u == ed){
int MIN = inf;
for(int i = pre[u]; i != -; i = pre[edge[i].u]){
if(MIN > edge[i].w - edge[i].f)
MIN = edge[i].w - edge[i].f;
}
for(int i = pre[u]; i != -; i = pre[edge[i].u]){
edge[i].f += MIN;
edge[i^].f -= MIN;
}
u = st;
ans += MIN;
continue;
}
bool flag = false;
int v;
for(int i = cur[u]; i != -; i = edge[i].nxt){
v = edge[i].v;
if(edge[i].w - edge[i].f && dep[v]+ == dep[u]){
flag = true;
cur[u] = pre[v] = i;
break;
}
}
if(flag){
u = v;
continue;
}
int MIN = n;
for(int i = head[u]; i != -; i = edge[i].nxt){
if(edge[i].w - edge[i].f && dep[edge[i].v] < MIN){
MIN = dep[edge[i].v];
cur[u] = i;
}
}
gap[dep[u]]--;
if(!gap[dep[u]])
return ans;
dep[u] = MIN+;
gap[dep[u]]++;
if(u != st)
u = edge[pre[u]].u;
}
return ans;
}
int main(){
int t, kase = ;
scanf("%d", &t);
while(t--){
init();
scanf("%d%d", &n, &m);
while(m--){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
}
st = , ed = n;
printf("Case %d: ", kase++);
printf("%d\n", sap());
}
return ;
}
最大流sap的更多相关文章
- hdu 4280 最大流sap
模板套起来 1 5 7 //5个结点,7个边 3 3 //坐标 3 0 3 1 0 0 4 5 1 3 3 //相连的结点和流 2 3 4 2 4 3 1 5 6 4 5 3 1 4 4 3 4 2 ...
- poj 2455 Secret Milking Machine 二分+最大流 sap
题目:p条路,连接n个节点,现在需要从节点1到节点n,不重复走过一条路且走t次,最小化这t次中连接两个节点最长的那条路的值. 分析:二分答案,对于<=二分的值的边建边,跑一次最大流即可. #in ...
- M - Escape - HDU 3605 - (缩点+最大流SAP)
题目大意:2012世界末日来了,科学家发现了一些星球可以转移人口,不过有的人可以在一些星球上生存有的人不行,而且每个星球都有一定的承载量,现在想知道是否所有的人都可以安全转移呢? 输入:首先输入一个N ...
- POJ1273 USACO 4.2.1 Drainage Ditches CodeVS1993草地排水 网络流 最大流 SAP
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - POJ 传送门 - CodeVS 题意概括 给出一个图,告诉你边和容量,起点是1,汇点是n,让你求最大流. 题解 ...
- hdu 4280 最大流 sap模板
给你岛的坐标求最西边到最东边的最大流 /* 最大流模板 sap */ #include<stdio.h> #include<string.h> #include<algo ...
- HDU2732 Leapin' Lizards 网络流 最大流 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8362002.html 题目传送门 - HDU2732 题意概括 给你一个网格,网格上的一些位置上有一只蜥蜴,所有 ...
- HDU 4183 Pahom on Water(最大流SAP)
Pahom on Water Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- BZOJ1458 士兵占领 网络流 最大流 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8384699.html 题目传送门 - BZOJ1458 题意概括 有一个M * N的棋盘,有的格子是障碍.现在你 ...
- BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP
由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html
随机推荐
- [物理学与PDEs]第2章习题10 一维理想流体力学方程组的 Lagrange 形式
试证明: 一维理想流体力学方程组的 Lagrange 形式 (5. 22)-(5. 24) 也可写成如下形式 $$\beex \bea \cfrac{\p \tau}{\p t}-\cfrac{\p ...
- sonarqube6.7部署文档
应用介绍:sonarqube是一个用于代码质量管理的开源平台,用于管理源代码的质量通过插件形式:可以支持包括Java.C#/C++.PL/SQL.Cobol.javascrip.Groovy等等二十几 ...
- Pandas的一些简单函数总结
pd.Series(my_list) # 从一个可迭代的对象 my_list 中创建一个数据组df.index = pd.date_range('2017/1/1', periods=df.shape ...
- Webform——JQuery基础(选择器、事件、DOM操作)
一.选择器 1.基本选择器 ①id选择器:# ②class选择器:. ③标签名选择:标签名 ④并列选择:用,隔开 ⑤后代选择:用空格隔开 代码用法展示: ...
- Python3:递归实现输出目录下所有的文件
今天来整理一下os库中方法的使用,如何输出一个目录下的所有文件? 1.首先介绍几个基本的的方法: 1)os.getcwd() #返回当前工作目录 2)os.listdir() #返回一个列表, ...
- android stuido搭配git常用命令
查看本地分支:git branch 查看远程分支:git branch -a 推送本地分支到远程:git push origin local_branch:remote_branch 推送远程访问 g ...
- 微信小程序scroll-view(或者其他view) 计算高度 px转rpx有关
wx.getSystemInfo({ success: function (res) { that.globalData.winWidth = res.windowWidth; that.global ...
- Eclipse编译运行没问题,但执行mvn clean install跑单元测试失败的原因解析
问题描述:mvn clean install编译工程并运行单元测试出现如下错误 Tests run: 3, Failures: 0, Errors: 2, Skipped: 0, Time elaps ...
- windows生成库文件
库文件的生成,包括静态库lib与动态库dll,需要改变编译输出的生成命令,可以一开始生成对应的库工程(或者在工程属性->常规->配置类型更改). 附基本对应命令: gcc –c -L .o ...
- IDEA 使用笔记
IDEA 关闭默认打开上一个项目 File | Settings | Appearance & Behavior | System Settings=> Reopen last proj ...