码迷,mamicode.com
首页 > 其他好文 > 详细

isap最大流

时间:2017-05-30 16:11:58      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:最大   .com   gap   max   targe   部分   name   class   amp   

捉摸了好几天,终于在弄清楚了一点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最大流

标签:最大   .com   gap   max   targe   部分   name   class   amp   

原文地址:http://www.cnblogs.com/foreverpiano/p/6919876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!