ISPA模板

http://blog.csdn.net/u011742541/article/details/16989645

int SAP_Max_Flow( int st,int end )
{
	int cur[maxn],pre[maxn],h[maxn],gap[maxn];
	int u,neck,tmp,i;
	memset( h,0,sizeof(h) );
	memset( gap,0,sizeof(gap) );
	int cur_flow,flow_ans = 0;
	for( int i = 0; i <= n; i ++ )
		cur[i] = head[i];
	gap[0] = n+1;                                      //顶点个数
	u = st;
	while( h[st] < n+1 )                               //当起点的距离标号大于顶点个数时算法结束
	{
		if( u == end )
		{
			cur_flow = inf;
			for( i = st; i != end; i = edge[cur[i]].v )
			{
				if( cur_flow > edge[cur[i]].w )
				{
					neck = i;
					cur_flow = edge[cur[i]].w;
				}
			}
			for( i = st; i != end; i = edge[cur[i]].v )
			{
				tmp = cur[i];
				edge[tmp].w -= cur_flow;
				edge[tmp^1].w += cur_flow;
			}
			flow_ans += cur_flow;
			u = neck;
		}
		for( i = cur[u]; i != -1; i = edge[i].next )
		{
			if( edge[i].w && h[u] == h[edge[i].v] + 1 )
				break;
		}
		if( i != -1 )
		{
			cur[u] = i;
			pre[edge[i].v] = u;
			u = edge[i].v;
		}
		else
		{
			if( 0 == --gap[h[u]] )
				break;
			cur[u] = head[u];
			for( tmp = n,i = head[u]; i != -1; i = edge[i].next )
				if( edge[i].w )
					tmp = tmp < h[edge[i].v]?tmp:h[edge[i].v];
			h[u] = tmp + 1;
			gap[h[u]] ++;
			if( u != st )
				u = pre[u];
		}
	}
	return flow_ans;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值