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算法的基本思想比较好理解,就是它的当前弧优化的思想,网上的资料也不多,所以对于当前弧的优化,我还是费了很大的功夫的,现在也一知半解,索性就写一篇博客,来发现自己哪里的算法思想还没理 ...
随机推荐
- 2749: [HAOI2012]外星人
首先像我一样把柿子画出来或者看下hint 你就会发现其实是多了个p-1这样的东东 然后除非是2他们都是偶数,而2就直接到0了 算一下2出现的次数就好 #include<cstdio> #i ...
- CH Round #24 - 三体杯 Round #1-C 逃不掉的路
留个e-DCC的板子 #include<cstdio> #include<iostream> #include<cstring> #include<cstdl ...
- P1228 地毯填补问题(分治)
P1228 地毯填补问题(分治) 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将 ...
- Coursera Algorithms Programming Assignment 1: Percolation(100分)
题目来源http://coursera.cs.princeton.edu/algs4/assignments/percolation.html 作业分为两部分:建立模型和仿真实验. 最关键的部分就是建 ...
- 【BZOJ3456】城市规划
题目 转送门 思路&算法 我们设点数为\(n\)的简单图的数量为\(f_n\), 点数为\(n\)的简单连通图有\(g_i\)个 于是我们知道,从\(n\)个点中选\(2\)个点有\(n \c ...
- go之结构体
一.关于结构体 简述 1.go 语言的切片可以存储同一类型的数据,但是结构体可以为不同项定义不同的数据类型 2.结构体是有一系列具有相同类型或不同类型的数据构成的数据集合 3.因为go 没有类似于类的 ...
- Struts2 在登录拦截器中对ajax请求的处理
前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...
- kotlin第一个项目的搭建
怎么在Android Studio中使用Kotlin? 1.使用Android Studio的插件 2.将Android Studio升级到3.0版本:目前不推荐,因为3.0的版本目前还是Dev Ch ...
- QS之force(3)
Example in project - First force signals in certain time and then noforce signals after some time. # ...
- C++版的LLC代码
图像稀疏编码总结:LLC和SCSPM,文章对稀疏编码讲解非常详细. <Locality-constrained Linear Coding for Image Classification> ...