首页 > 代码库 > isap最大流

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最大流