社区讨论

麻了

灌水区参与者 6已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lo3jqajc
此快照首次捕获于
2023/10/24 07:46
2 年前
此快照最后确认于
2023/10/29 10:56
2 年前
查看原帖
是标题党,HLPP模板题深夜求调
CPP
#include<bits/stdc++.h>
#define debug puts("ok")
using namespace std;
const int N=1210,M=120010,inf=0x3f3f3f3f;
struct edge{
	int ed,next;
	int w;
}a[M*2];
int nbs[N],h[N],gap[N*2],d[N];
int n,m,g,s,t;
bool v[N];
struct cmp{
	bool operator()(int x,int y)const{
		return h[x]<h[y];
	}
};
priority_queue<int,vector<int>,cmp>p;
void add(int x,int y,int z){
	g++;
	a[g].ed=y;
	a[g].next=nbs[x];
	a[g].w=z;
	nbs[x]=g;
	return;
}
void read(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1,x,y,z;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,0);
	}
	return;
}
bool bfs(){
	memset(h,inf,sizeof(h));
	queue<int>q;
	h[t]=0;q.push(t);
	while(!q.empty()){
		int k=q.front();q.pop();
		for(int x=nbs[k];x;x=a[x].next){
			int u=a[x].ed;
			if(a[x^1].w&&h[u]>h[k]+1){
				h[u]=h[k]+1;
				q.push(u);
			}
		}
	}
	return h[s]!=inf;
}
void flow(int k){
	for(int x=nbs[k];x;x=a[x].next){
		int u=a[x].ed,l=a[x].w;
		if(!l||h[u]+1!=h[k])
		continue;
		int f=min(l,d[k]);
		d[k]-=f;d[u]+=f;
		a[x].w-=f;a[x^1].w+=f;
		if(u!=s&&u!=t&&!v[u]){
			p.push(u);
			v[u]=1;
		}
		if(!d[k])break;
	}
	return;
}
void relabel(int k){
	h[k]=inf;
	for(int x=nbs[k];x;x=a[x].next){
		int u=a[x].ed;
		if(a[x].w)
		h[k]=min(h[k],h[u]+1);
	}
	return;
}
int hlpp(){
	if(!bfs())return 0;
	h[s]=n;
	for(int i=1;i<=n;i++)
	if(h[i]!=inf)gap[h[i]]++;
	for(int x=nbs[s];x;x=a[x].next){
		int u=a[x].ed,l=a[x].w;
		if(!l)continue;
		d[s]-=l;d[u]+=l;
		a[x].w-=l;a[x^1].w+=l;
		if(u!=s&&u!=t&&!v[u]){
			if(h[u]!=inf)
			p.push(u);
			v[u]=1;
		}
	}
	while(!p.empty()){
		for(int i=1;i<=n;i++)
    	cout<<h[i]<<" "<<d[i]<<"|";
    	puts("");
		int k=p.top();p.pop();
		v[k]=0;flow(k);
		if(!d[k])continue;
		gap[h[k]]--;
		if(!gap[h[k]]){
			for(int i=1;i<=n;i++)
			if(i!=s&&i!=t&&h[i]>h[k])
				h[i]=max(h[i],n+1);
		}
		relabel(k);
		gap[h[k]]++;
		p.push(k);v[k]=1;
	}
	return d[t]; 
}
signed main(){
	read();
	int AC=hlpp();
	printf("%d",AC);
    return 0;
}
这个蒟蒻已经快被抽干了,RERE何时了……

回复

7 条回复,欢迎继续交流。

正在加载回复...