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的更多相关文章

  1. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  2. ISAP 最大流 最小割 模板

    虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...

  3. 【网络流#8】POJ 3469 Dual Core CPU 最小割【ISAP模板】 - 《挑战程序设计竞赛》例题

    [题意]有n个程序,分别在两个内核中运行,程序i在内核A上运行代价为ai,在内核B上运行的代价为bi,现在有程序间数据交换,如果两个程序在同一核上运行,则不产生额外代价,在不同核上运行则产生Cij的额 ...

  4. poj2914无向图的最小割模板

    题意:给出无向图的点,边,权值.求最小割. 思路:根据题目规模,最大流算法会超时. 网上参考的模板代码. 代码: /*最小割集◎Stoer-Wagner算法:一个无向连通网络,去掉一个边集可以使其变成 ...

  5. 最大流&最小割 - 专题练习

    [例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...

  6. UVa11248 Frequency Hopping(最大流+最小割)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...

  7. matlab练习程序(最大流/最小割)

    学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割 ...

  8. 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割

    Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...

  9. HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...

随机推荐

  1. 吴裕雄--天生自然 JAVASCRIPT开发学习:弹窗

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script> ...

  2. SQL基础教程(第2版)第5章 复杂查询:5-3 关联子查询

    第5章 复杂查询:5-3 关联子查询 ● 关联子查询会在细分的组内进行比较时使用.● 关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分.● 关联子查询的结合条件如果未出现在子查询之中就 ...

  3. Django模板渲染——(二)

    模板标签 模板是由HTML代码和一些逻辑控制代码组成的,逻辑控制代码除了前面介绍的变量和过滤器,还要一个非常重要的模板标签.模板标签的语法规则是{% tag %},模板标签在渲染的过程中能提供任意的逻 ...

  4. Scala(一)——scala+Idea环境配置

    Java虚拟机的确是很强大,有很多计算机语言可以运行在虚拟机上,完善了虚拟机上多语言编程. 近年来,大数据云计算,大数据的火爆也让一些小众语言火了起来,如Python,Scala等.这些语言编写简单, ...

  5. Spring Cloud Alibaba 教程 | Nacos(一)

    什么是Nacos Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos 致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态 ...

  6. [Algo] 611. Compress String II

    Given a string, replace adjacent, repeated characters with the character followed by the number of r ...

  7. PAT Basic 1017 A除以B (20) [数学问题-⼤整数运算]

    题目 本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成⽴. 输⼊格式: 输⼊在1⾏中依次给出A和B,中间以1空格分隔. ...

  8. LeetCode No.160,161,162

    No.160 GetIntersectionNode 相交链表 题目 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 输入:intersectVal ...

  9. 通过编写c语言程序,运行时实现打印另一个程序的源代码和行号

    2017年6月1日程序编写说明: 1.实现行号的打印,实现代码的读取和输出,理解主函数中的参数含义. 2.对fgets函数理解不够 3.对return(1); return 0的含义理解不够 4.未实 ...

  10. oracle误删scott文件如何恢复

    找到oracle的路径,一般是 某盘:\app\用户名\product\11.2.0\dbhome_1\RDBMS\ADMIN\scott.sql 这样找到scott.sql ,其中有恢复所有内容的S ...