isap算法模板poj 1273gap+弧优化 最大流
几个比较好的博客
http://www.renfei.org/blog/isap.html
http://kenby.iteye.com/blog/945454
http://blog.csdn.net/mypsq/article/details/37959249
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define inf 999999
#define N 300
struct node {
int u,v,w,next;
}bian[N*N*2];
int head[N],yong,stac[N],top,start,n,cur[N],dis[N],gap[N];
void init() {
memset(head,-1,sizeof(head));
memset(dis,-1,sizeof(dis));
memset(gap,0,sizeof(gap));
memset(cur,0,sizeof(cur));
top=0;start=1;yong=0;
}
void addedge(int u,int v,int w) {/*建边*/
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void bfs() {
queue<int>q;
q.push(n);
dis[n]=0;
int i;
/*建立层次图*/
while(!q.empty()) {
int c=q.front();
q.pop();
for(i=head[c];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(dis[v]==-1) {//这里注意不能加这个条件(bian[i^1].w)
dis[v]=dis[c]+1;
q.push(v);
}
}
}
}
int ISAP() {
int k,i,sum=0;
bfs();
for(i=1;i<=n;i++)//cur数组记录当前位置的边的坐标
cur[i]=head[i];
for(i=1;i<=n;i++)
gap[dis[i]]++;//gap优化记录到汇点距离为dis[i]的个数
k=start;
while(dis[start]<n) {
if(k==n) {//如果满足条件
int mi=inf,index;
for(i=0;i<top;i++)
if(mi>bian[stac[i]].w) {//找最小流
mi=bian[stac[i]].w;
index=i;
}
for(i=0;i<top;i++) {//修改残留网络
bian[stac[i]].w-=mi;
bian[stac[i]^1].w+=mi;
}
sum+=mi;
top=index;//定位到最小的边的权值的位置
k=bian[stac[top]].u;//当前的k
}
for(i=cur[k];i!=-1;i=bian[i].next) {//遍历未走过的边
int v=bian[i].v;
if(bian[i].w&&dis[k]==dis[v]+1) {//
cur[k]=i;
k=v;
stac[top++]=i;
break;
}
}
if(i==-1) {/*更新*/
int m=n;
for(i=head[k];i!=-1;i=bian[i].next)
if(bian[i].w&&m>dis[bian[i].v]){
m=dis[bian[i].v];
cur[k]=i;//记录当前的边的下标
}
if(--gap[dis[k]]==0)break;//出现断层
dis[k]=m+1;gap[dis[k]]++;
if(k!=start)//如果非源点的话
k=bian[stac[--top]].u;//退点,推到上一个点,将当前边删掉,因为是<top
}
}
return sum;
}
int main() {
int m,i,j,k;
while(scanf("%d%d",&m,&n)!=EOF) {
init();
while(m--) {
scanf("%d%d%d",&i,&j,&k);
addedge(i,j,k);
addedge(j,i,0);
}
printf("%d\n",ISAP());
}
return 0;
}
isap算法模板poj 1273gap+弧优化 最大流的更多相关文章
- poj 3469 最小割模板sap+gap+弧优化
/*以核心1为源点,以核心2为汇点建图,跑一遍最大流*/ #include<stdio.h> #include<string.h> #include<queue> ...
- 网络流小记(EK&dinic&当前弧优化&费用流)
欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...
- ARC085E(最小割规划【最大流】,Dinic当前弧优化)
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...
- P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)
P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...
- 最大流当前弧优化Dinic模板
最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环,每根水管有流量限制,并且流入量等于流出量 有源汇点的最小流限制的最大流 顶 ...
- 最大流当前弧优化Dinic分层模板
最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的有向边 顶点有流量限制:拆成2个点,连接一条容量为点容量限制的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环 有源汇点的最 ...
- POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]
妖怪题目,做到现在:2017/8/19 - 1:41…… 不过想想还是值得的,至少邻接矩阵型的Dinic算法模板get√ 题目链接:http://poj.org/problem?id=1815 Tim ...
- 【最大流之Dinic算法】POJ1273 【 & 当前弧优化 & 】
总评一句:Dinic算法的基本思想比较好理解,就是它的当前弧优化的思想,网上的资料也不多,所以对于当前弧的优化,我还是费了很大的功夫的,现在也一知半解,索性就写一篇博客,来发现自己哪里的算法思想还没理 ...
随机推荐
- 好记性不如烂笔头——WebService与Remoting
一.WebService总体上分为5个层次: 1)HTTP传输信道 2)XML的数据格式 3)SOAP的封装协议,用于传输 4)WSDL的描述方式,用于引用 5)UDDI,通用描述.发现与集成服务,用 ...
- Windows热键注册的底层原理
要像系统注册一个全局热键,需要用到RegisterHotKey,函数用法如下(MSDN):BOOL RegisterHotKey( ...
- oc36--自定义构造方法在继承中的表现
// // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int ag ...
- lucene 范围过滤
Lucene里面有关于Filter的整体知识 下面,我们来看下具体的在代码里怎么实现,先来看下我们的测试数据 Java代码 id score bookname ena ...
- ASP.NET快速开发框架不得不做的几个功能、高大上档次后台管理UI界面
俗话说磨刀不误砍柴工,确实,一早上花一个小时去磨刀一天下来肯定能多砍很多柴.我们做软件开发也是同样的道理,有套好开发框架在手里,开发也是事半功倍.那么一套MVC快速开发框架至少得具有哪些功能才能帮我们 ...
- 第2章 安装Nodejs 2-3 Windows下安装Nodejs
http://nodejs.org
- centos的vsftp修改上传下载速度
比如你想限制本地用户的上传速度和下载速度为1MB/s,则在vsftpd.conf中添加以下内容:local_max_rate = 1048576 ※ 默认单位是Byte/s
- selenium3 + python - expected_conditions判断元素
expected_conditions 类 title_is: 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值 title_contains : 判断当前页面的title是否包含预 ...
- selenium3 + python - page_source页面源码
前言: 有时候通过元素的属性的查找页面上的某个元素,可能不太好找,这时候可以从源码中爬出想要的信息.selenium的page_source方法可以获取到页面源码. 本次以博客园为例,先爬取页面源码, ...
- HDU2186
2019-05-30 19:31:10 水题 #include <bits/stdc++.h> using namespace std; int main() { int c; scanf ...