网络最大流ISAP算法

模板##

int ISAP(int s,int t,int n){
	for(int i=0;i<=n;i++) cur[i]=h[i],d[i]=INF;
	queue<int>q;
	q.push(t);
	d[t]=0;
	int flow=0;
	while(!q.emtpy()){
		int u=q.top();q.pop();
		for(int i=h[u];~i;i=e[i].xt)
			if(d[e[i].t]==INF) num[d[e[i].t]=d[u]+1]++,q.push(e[i].t);
	}
	for(int x=s,ok=0;d[s]<n;ok=0){
		if(x==t){
			int a=INF;
			for(;x!=s;x=e[p[x]].f) 
				a=min(a,e[p[x]].capa-e[p[x]].flow);
			for(x=t,flow+=a;x!=s;x=e[p[x]].f) 
				e[p[x]].flow+=a,e[p[x]^1].flow-=a;
		}
		for(int i=cur[x];~i;i=e[i].xt)
			if(e[i].capa>e[i].flow&&d[e[i].t]==d[u]-1){
				ok=1;
				cur[x]=i;
				p[x=e[i].t]=i;
				break;
			}
		if(!ok){
			int m=n-1;
			for(int i=cur[x]=h[x];~i;i=e[i].xt)
				if(e[i].capa>e[i].flow) m=min(m,d[e[i].t]);
			if(--num[d[x]]==0) break;
			num[d[x]=m+1]++
			if(x!=s) x=e[p[x]].f;
		}
	}
	return flow;
}
posted @ 2018-08-15 11:27  LSQ647  阅读(241)  评论(0编辑  收藏  举报