80pts,660ms代码求卡常
查看原帖
80pts,660ms代码求卡常
841638
Igunareo楼主2024/8/6 09:51
#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int,int> >x[1000005],y[1000005],z[1000005];
int q[1000005],head=1,tail=0;
int l[1000005],num[1000005],points[1000005],dis[1000005],cnt=0,add;
char *p1,*p2,buf[1<<20];
inline char gc(){
    if(p1==p2)
        p2=(p1=buf)+fread(buf,1,1<<20,stdin);
    return (p1==p2)?EOF:*p1++;
}
inline int read(){
	register int x=0,w=1;
	register char ch=gc();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			w=-1;
		ch=gc();
	}
	while(ch>='0'&&ch<='9') {
		x=(x<<3)+(x<<1)+(ch^48);
		ch=gc();
	}
	return x*w;
}
signed main(){
	int	n=read(),m=read(),s=read(),t=read();
	for(register int i=1;i<=m;i++){
		int a=read(),b=read(),c=read();
		x[a].emplace_back(b,c);
		z[b].emplace_back(a,c);
		l[b]++;
	}
	for(register int i=1;i<=n;i++)if(!l[i])q[++tail]=i;
	for(register int i=1;i<=n;i++){
		int now=q[head];
		num[now]=++cnt;
		points[cnt]=now;
		head++;
		for(register int i=0;i<x[now].size();++i){
			l[x[now][i].first]--;
			if(!l[x[now][i].first])q[++tail]=x[now][i].first;
		}
	}
	for(register int i=num[t];i>num[s];i--)for(register int j=0;j<z[points[i]].size();j++)y[num[z[points[i]][j].first]].emplace_back(i,z[points[i]][j].second);
	dis[num[s]]=1e18;
	for(register int i=num[s];i<num[t];i++){
		for(register int j=0;dis[i]&&j<y[i].size();j++){
			if(y[i][j].first<=num[t]){
				dis[y[i][j].first]+=min(dis[i],y[i][j].second);
				dis[i]-=min(dis[i],y[i][j].second);
			}
		}
	}
	printf("%lld",dis[num[t]]);
	return 0;
}
2024/8/6 09:51
加载中...