您的位置:首页 > 理论基础 > 计算机网络

网络流——SAP模板

2016-03-20 14:38 423 查看
//网络流SAP模板,复杂度O(N^2*M)
//使用前调用init(源点,汇点,图中点的个数),然后调用add_edge()加边
//调用getflow得出最大流
#define N 55
#define M 500500
#define INF 0x3fffff

struct Max_Flow
{
struct node
{
int to,w,next;
}edge[M];

int s,t;
int nn;
int cnt,pre
;
int lv
,gap
;

void init(int ss,int tt,int num)
{
s=ss;
t=tt;
nn = num;//
cnt=0;
memset(pre,-1,sizeof(pre));
}
void add_edge(int u,int v,int w)//同时建两条边
{
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=pre[u];
pre[u]=cnt++;

edge[cnt].to=u;
edge[cnt].w=0;
edge[cnt].next=pre[v];
pre[v]=cnt++;
}

int sdfs(int k,int w)
{
if(k==t) return w;
int f=0;
int mi=nn-1;
for(int p=pre[k];p!=-1;p=edge[p].next)
{
int v=edge[p].to,tw=edge[p].w;
if(tw!=0)
{
if(lv[k]==lv[v]+1)
{
int tmp=sdfs(v,min(tw,w-f));
f+=tmp;
edge[p].w-=tmp;
edge[p^1].w+=tmp;
if(f==w||lv[s]==nn) break;
}
if(lv[v]<mi) mi=lv[v];
}
}
if(f==0)
{
gap[lv[k]]--;
if( gap[ lv[k] ]==0 )
{
lv[s]=nn;
}
lv[k]=mi+1;
gap[lv[k]]++;
}
return f;
}

int getflow()
{
int sum=0;
memset(lv,0,sizeof(lv));
memset(gap,0,sizeof(gap));
gap[0]=nn;
while(lv[s]<nn)
{
sum+=sdfs(s,INF);
}
return sum;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: