最大流/最小割模板(isap) POJ1273
isap模板核心代码:
//d[]为距离标号数组,d[i]表示节点i到汇点的距离
//gap[]为GAP优化数组,gap[i]表示到汇点距离为i的节点个数
int dfs(int k,int flow){//flow为当前剩余流量
int i;
if(k==t)return flow;
int sum=;
for(i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].f&&d[k]==d[v]+){//判断能否通过流量以及走的是否为最短路
int f=dfs(v,min(flow-sum,e[i].f));//注意是flow-sum,要将已用过的流量减去
sum+=f;head[k]=i;//当前弧优化
e[i].f-=f;e[i^].f+=f;
if(sum==flow||d[s]==cnt)return sum;//流量全部流完或者达到退出条件则返回
}
}
if((--gap[d[k]])==)d[s]=cnt;//若gap[]出现断层,则无法增广
gap[++d[k]]++;//
head[k]=h[k];//
return sum;
} int sap(){
memcpy(h,head,sizeof(head));
memset(d,,sizeof(d));
memset(gap,,sizeof(gap));
gap[]=cnt;
int flow=;
while(d[s]<cnt)
flow+=dfs(s,inf);
return flow;
}
一道水题:poj1273
题意:现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条水渠,给出这n条水渠所连接的点和所能流过的最大流量,求从源点到汇点能流过的最大流量。
有多组数据!网上查的中文题意没说,样例只给了一组,WA。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define repu(i,x,y) for(int i=x;i<=y;i++)
using namespace std; struct edge{int to,nxt,f;}e[];
const int inf=1e9;
int head[],h[],d[],gap[],n,m,ne=,s,t,cnt; void add(int u,int v,int f){
e[++ne]=(edge){v,head[u],f};head[u]=ne;
} //d[]为距离标号数组,d[i]表示节点i到汇点的距离
//gap[]为GAP优化数组,gap[i]表示到汇点距离为i的节点个数
int dfs(int k,int flow){//flow为当前剩余流量
int i;
if(k==t)return flow;
int sum=;
for(i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].f&&d[k]==d[v]+){//判断能否通过流量以及走的是否为最短路
int f=dfs(v,min(flow-sum,e[i].f));//注意是flow-sum,要将已用过的流量减去
sum+=f;head[k]=i;//当前弧优化
e[i].f-=f;e[i^].f+=f;
if(sum==flow||d[s]==cnt)return sum;//流量全部流完或者达到退出条件则返回
}
}
if((--gap[d[k]])==)d[s]=cnt;//若gap[]出现断层,则无法增广
gap[++d[k]]++;//
head[k]=h[k];//
return sum;
} int sap(){
memcpy(h,head,sizeof(head));
memset(d,,sizeof(d));
memset(gap,,sizeof(gap));
gap[]=cnt;
int flow=;
while(d[s]<cnt)
flow+=dfs(s,inf);
return flow;
} int main(){
int u,v,f;
while(scanf("%d%d",&n,&m)!=EOF){
ne=;
memset(e,,sizeof(e));
memset(head,,sizeof(head));
repu(i,,n){
scanf("%d%d%d",&u,&v,&f);
add(u,v,f);add(v,u,);
}
cnt=m;s=;t=m;
int ans=sap();
printf("%d\n",ans);
}
return ;
}
最大流/最小割模板(isap) POJ1273的更多相关文章
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- ISAP 最大流 最小割 模板
虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...
- 【网络流#8】POJ 3469 Dual Core CPU 最小割【ISAP模板】 - 《挑战程序设计竞赛》例题
[题意]有n个程序,分别在两个内核中运行,程序i在内核A上运行代价为ai,在内核B上运行的代价为bi,现在有程序间数据交换,如果两个程序在同一核上运行,则不产生额外代价,在不同核上运行则产生Cij的额 ...
- poj2914无向图的最小割模板
题意:给出无向图的点,边,权值.求最小割. 思路:根据题目规模,最大流算法会超时. 网上参考的模板代码. 代码: /*最小割集◎Stoer-Wagner算法:一个无向连通网络,去掉一个边集可以使其变成 ...
- 最大流&最小割 - 专题练习
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...
- UVa11248 Frequency Hopping(最大流+最小割)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...
- matlab练习程序(最大流/最小割)
学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割 ...
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
- HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...
随机推荐
- 编写注册表.reg文件
Windows 中的注册表文件( system.dat 和 user.dat )是 Windows 的核心数据库,因此,对 Windows 来说是非常重要的. 通过修改注册表文件中的数据,可以达到优化 ...
- 康冕峰IT技术总结博客CSDN索引
计算1-x内的质数, 结果保存在mysql中. Java 程序员面试笔试宝典 4.1基础知识https://blog.csdn.net/qq_40993412/article/details/1040 ...
- kotlin黑马影音项目学习笔记
1.包布局 --------model--------presenter----------------impl----------------interf--------view--------ui ...
- 十二星座 英文名:Aries 金牛座 (4/21 - 5/20)的英文名: Taurus 双子座 (5/21 - 6/21)的英文名: Gemini 巨蟹座 (6/22 - 7/22)的英文名: Cancer 狮子座 (7/23 - 8/22)的英文名: Leo 处女座/室女座 (8/23 - 9/22)的英文名: Virgo 天秤座 (9/2
十二星座的具体顺序是:白羊座(Aries).金牛座(Taurus).双子座(Gemini).巨蟹座(Cancer).狮子座(Leo).处女座(Virgo).天秤座(Libra).天蝎座(Scorpio ...
- php 去除中间空格
<?php $str = 'a b c d e'; echo preg_replace('# #','',$str);//输出 "abcde"
- 吴裕雄--天生自然 PHP开发学习:表单 - 验证邮件和URL
$name = test_input($_POST["name"]); if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $ ...
- flutter实现promise中resolve(RxJava中emiter.onSucess("result"))功能
BehaviorSubject openCameraController = BehaviorSubject(); BridgeChannel _openCamera() { print('- - - ...
- 转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨
1.引子 转发和重定向是我们在做web项目中常用到的两个术语,有必要理清两者的区别和与之相关的参数.属性获取问题. 2.转发和重定向 1).转发 转发是服务器行为,将当前请求(Request)和响应( ...
- python深度学习6.2
Deep Learning with Python>第六章 6.2 理解循环神经网络(RNN) 神机喵算 2018.09.01 20:40 字数 2879 阅读 104评论 0喜欢 1 沉下心来 ...
- Java--Json解析
普通Json {"code":"S0000", "describe":"数据正常返回", "result&qu ...