你谷数据真的害人匪浅。。。
查看原帖
你谷数据真的害人匪浅。。。
203008
山田リョウ楼主2022/6/6 22:45

。。。在洛谷上过了,交到 uoj 就挂了。。。

不知道为什么 RE 了

// Problem: P4722 【模板】最大流 加强版 / 预流推进
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4722
// Memory Limit: 500 MB
// Time Limit: 1500 ms

#include<stdio.h>
#include<stack>
const int maxn=1200,maxm=120000,inf=0x7f7f7f7f;
struct{
	int v;long long c;int nxt; 
}edge[maxm<<1];
int head[maxn|1],ht[maxn|1],gap[maxn<<1|1],lv,n,s,t,mp[maxn|1][maxn|1];
long long ex[maxn|1];
std::stack<int>stk[maxn<<1|1];
inline int min(int x,int y){return x>y?y:x;}
inline int max(int x,int y){return x>y?x:y;}
inline void addedge(int u,int v,long long c){
	static int tot=0;
    if(~mp[u][v])edge[mp[u][v]].c+=c;
    else{
		edge[tot]={v,c,head[u]},mp[u][v]=head[u]=tot++;
	    edge[tot]={u,0,head[v]},head[v]=tot++;
	}
}
bool push(int u){
	int v;long long c;
	for(int i=head[u];~i;i=edge[i].nxt){
		v=edge[i].v,c=edge[i].c;
		if(!c||ht[u]!=ht[v]+1)continue;
		c=ex[u]>c?c:ex[u];
		if(v!=s&&v!=t&&!ex[v])stk[ht[v]].push(v),lv=max(lv,ht[v]);
		ex[u]-=c,ex[v]+=c,edge[i].c-=c,edge[i^1].c+=c;
		if(!ex[u])return 0;
	}
	return 1;
}
void relabel(int u){
	ht[u]=inf;
	for(int i=head[u];~i;i=edge[i].nxt)if(edge[i].c)ht[u]=min(ht[u],ht[edge[i].v]);
	if(++ht[u]<n)stk[ht[u]].push(u),lv=max(lv,ht[u]),++gap[ht[u]];
}
bool bfs(){
	for(int i=1;i<=n;++i)ht[i]=inf;
	static int q[maxn];
	int l=0,r=0;q[r++]=t,ht[t]=0;
	for(;l<r;++l)
		for(int i=head[q[l]];~i;i=edge[i].nxt){
			if(q[l]==t&&edge[i].v==s)ex[t]+=edge[i^1].c;
			else if(edge[i^1].c&&ht[edge[i].v]==inf)
				ht[edge[i].v]=ht[q[l]]+1,q[r++]=edge[i].v;
		}
	return ht[s]!=inf;
}
int maxht(){
	for(;(~lv)&&stk[lv].empty();--lv);
	return (~lv)?stk[lv].top():0;
}
long long HLPP(){
	if(!bfs())return ex[t];
	for(int i=0;i<n;++i)gap[i]=0;
	for(int i=1;i<=n;++i)if(ht[i]<n)++gap[ht[i]];
	ht[s]=n;
	for(int i=head[s];~i;i=edge[i].nxt)
		if(edge[i].c){
			if(edge[i].v!=t&&!ex[edge[i].v])
				stk[ht[edge[i].v]].push(edge[i].v),lv=max(lv,ht[edge[i].v]);
			ex[edge[i].v]+=edge[i].c,edge[i^1].c=edge[i].c,edge[i].c=0;
		}
	for(int u;u=maxht();){
		stk[lv].pop();
		if(push(u)){
			if(!(--gap[ht[u]]))
				for(int i=1;i<=n;i++)
					if(i!=s&&i!=t&&ht[i]>ht[u])
						ht[i]=max(ht[i],n+1);
			relabel(u);
		}
	}
	return ex[t];
}
int main(){
	int m,u,v;long long c;
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1;i<=n;head[i++]=-1)for(int j=1;j<=n;++j)mp[i][j]=-1;
	for(;m--;addedge(u,v,c))scanf("%d%d%lld",&u,&v,&c);
	printf("%lld",HLPP());
	return 0;
}
2022/6/6 22:45
加载中...