捉摸了好几天,终于在弄清楚了一点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; }
时间: 2024-10-05 06:30:23