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