HLPP WA on #4 92pts
查看原帖
HLPP WA on #4 92pts
1171250
w132326820楼主2025/1/27 12:12

#include <bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,m,s,t,x,y,z,id;
#define int long long
const int inf=0x3f3f3f3f3f3f3f3f;
int book[N],h[N],u[N],v[N],w[N];
int pre[N],nxt[N];
void add(int x,int y,int z){
	u[id]=x,v[id]=y,w[id]=z;
	nxt[id]=pre[x];
	pre[x]=id++;
}
bool init(){
	queue<int>q;
	memset(h,0x3f,sizeof(h));
	h[t]=0;
	q.push(t);
	while(!q.empty()){
		int l=q.front();
		q.pop();
		for(int i=pre[l];i!=-1;i=nxt[i]){
			if(w[i^1]&&h[v[i]]>h[l]+1){
				h[v[i]]=h[l]+1;
				q.push(v[i]);
			}
		}
	}
	return h[s]!=inf;
}
int e[N];
struct cmp{
	bool operator ()(int x,int y){
		return h[x]<h[y];
	}
};
priority_queue<int,vector<int>,cmp>q;
void ppos(int x,int i,int tp){
	w[i]-=tp;
	w[i^1]+=tp;
	e[x]-=tp;
	e[v[i]]+=tp;
}
void push(int x){
	for(int i=pre[x];i!=-1;i=nxt[i]){
		if(w[i]&&h[v[i]]+1==h[x]){
			int tp=min(e[x],w[i]);
			ppos(x,i,tp);
			if(v[i]!=s&&v[i]!=t&&!book[v[i]]){
				q.push(v[i]);
				book[v[i]]=1;
			}
			if(!e[x])break;
		}
	}
}
void rel(int x){
	h[x]=inf;
	for(int i=pre[x];i!=-1;i=nxt[i]){
		if(w[i]&&h[v[i]]+1<h[x])
			h[x]=h[v[i]]+1;
	}
}
void high(int x){
	for(int i=1;i<=n;i++){
		if(i!=s&&i!=t&&i>x&&i<n+1)
			h[i]=n+1;
	}
}
int gap[N];
int hlpp(){
	if(!init())return 0;
	h[s]=n;
	for(int i=1;i<=n;i++)
		if(h[i]!=inf)gap[h[i]]++;
	for(int i=pre[s];i!=-1;i=nxt[i]){
		int tp=w[i];
		if(tp){
			ppos(s,i,tp);
			if(v[i]!=s&&v[i]!=t&&!book[v[i]]){
				q.push(v[i]);
				book[v[i]]=1;
			}
		}
	}
	while(!q.empty()){
		int l=q.top();
		q.pop();
		book[l]=0;
		push(l);
		if(e[l]){
			gap[h[l]]--;
			if(!gap[h[l]]){
				high(h[l]);
			}
			rel(l);
			gap[h[l]]++;
			q.push(l);
			book[l]=1;
		}
	}
	return e[t];
}
signed main(){
	cin>>n>>m>>s>>t;
	memset(pre,-1,sizeof(pre));
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,0);
	}
	cout<<hlpp();
	return 0;
}





2025/1/27 12:12
加载中...