isap最大流

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了isap最大流相关的知识,希望对你有一定的参考价值。

捉摸了好几天,终于在弄清楚了一点isap的算法~

isap就是改进的dinic算法,进行了重贴标签的运算,并且加入了gap优化,以及当前弧的优化,从而大大提升运算速度。具体分析已经在之前的转载的文章中分析过了。下面是链接

我是链接~

这是我的代码~(标注!的为第二次写的时候需要注意的部分)

#include<bits/stdc++.h>
#define maxn 3000000 
using namespace std;

struct Edge
{
   int to,w,next;
}edge[maxn];

int n,m,s,t;
int head[maxn],gap[maxn],h[maxn],cur[maxn];

int cnt=0;

void add(int a,int b,int c)
{
   edge[cnt].w=c;
   edge[cnt].to=b;
   edge[cnt].next=head[a];
   head[a]=cnt++;
}

int  isap(int x,int fr)
{
    if(x==t)
       return fr;
    int rest=0;
    for(int i=cur[x];~i;i=edge[i].next)
    {
	    int j=edge[i].to;
	    if(h[j]+1==h[x]&&edge[i].w)//!
	     {
		    int f=isap(j,min(edge[i].w,fr-rest));
		    edge[i].w-=f;
		    edge[i^1].w+=f;
		    rest+=f;
		    if(rest==fr)  return fr;
		    if(edge[i].w) cur[x]=i;
		 }
	}
	--gap[h[x]];
	if(!gap[h[x]]) h[s]=n+2;//! 
	h[x]++;gap[h[x]]++;//进行重贴标签
	cur[x]=head[x];
	return rest; 
}

int main()
{
   int ans=0;
   memset(head,-1,sizeof(head));
   cin>>n>>m>>s>>t;
   while(m--)
   {
      int t1,t2,t3;
      cin>>t1>>t2>>t3;
      add(t1,t2,t3);add(t2,t1,0);
   }
   for(int i=0;i<n;i++)
     cur[i]=head[i];
    while(h[s]<n+2)
      ans+=isap(s,1e9);
    cout<<ans<<endl;
   return 0;
}

 

以上是关于isap最大流的主要内容,如果未能解决你的问题,请参考以下文章

最大流 ISAP

HDU-4280-Island Transport(网络流,最大流, ISAP)

模板ISAP最大流

算法学习笔记(8.1): 网络最大流算法 EK, Dinic, ISAP

圆桌问题 网络流Isap算法

CCF(引水入城:60分):最大流+ISAP算法