首页 > 代码库 > 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最大流
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。