样例没过求助
查看原帖
样例没过求助
550957
Anonymely楼主2022/7/14 08:10
#include<bits/stdc++.h>
using namespace std;

#define newline putchar('\n')
#define newspace putchar(' ')
#define ll long long
#define inf 1000000005
#define mod 998244353
#define eps 0.0000001
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define N 500005

namespace fastIO{
	template<class T> void read(T &x){
		x=0;
		int fl=1;
		char ch=getchar();
		while(ch<'0'||ch>'9'){if(ch=='-')fl=-1;ch=getchar();}
		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch&15);ch=getchar();}
		x*=fl;
	}
	template<class T> void read(T &x,T &y){
		read(x);read(y);
	}
	template<class T> void read(T &x,T &y,T &z){
		read(x);read(y);read(z);
	}
	template<class T> void write(T x){
		if(x<0){putchar('-');x=-x;}
		if(x/10)write(x/10);
		putchar(x%10+'0');
	}
	template<class T> void read(T *a,T n){
		for(int i=1;i<=n;i++)read(a[i]);
	}
	template<class T> void write(T *a,T n){
		for(int i=1;i<=n;i++)write(a[i]),newspace;
	}
}

using namespace fastIO;

namespace math{
	template<class T> ll fastpow(T a,T b,T md=1e18){
		ll ans=1;
		for(;b;b>>=a,a=(a*a)%mod)if(b&1)ans=ans*a%md;
		return ans;
	}
	template<class T> ll A(T n,T m,T md=1e18){
		ll ans1=1,ans2=1;
		for(int i=1;i<=n-m;i++)ans1=ans1*i%md,ans2=ans2*i%md;
		for(int i=n-m=1;i<=n;i++)ans1=ans1*i%md;
		return ans1*fastpow(ans2,md-2,md)%md;
	}
	template<class T> ll C(int n,int m,T md=1e18){
		return A(n,m,md)*fastpow(A(m,m,md),md-2,md)%md;
	}
	template<class T> ll myfloor(T n,T m){
		return n%m==0 ? n/m : (n/m+1);
	}
}

using namespace math;

namespace graph{
	template<class T> void floyd(T *a,int n){
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					a[i][j]=min(a[i][k]+a[k][j],a[i][j]);
				}
			}
		}
	}
}

int n,m;
int x1,x2,y1,y2;
struct edge{
	int to,next,del;
}e[N<<1],e1[N<<1];
int head[N],head1[N],cnt=0,cnt1=0;
int dis[5][N];
int in[N];
int len[N];
int vis[N];

void add(int u,int v,int k){
	e[++cnt].to=v;
	e[cnt].next=head[u];
	e[cnt].del=k;
	head[u]=cnt;
}

void add1(int u,int v,int k){
	e1[++cnt1]={v,head1[u],k};
	head1[u]=cnt1;
	in[v]++;
}

void dijkstra(int s,int I){
	memset(vis,0,sizeof(vis));
	memset(dis[I],0x3f,sizeof(dis[I]));
	priority_queue<pii,vector<pii>,greater<pii> > q;
	q.push({0,s});
	dis[I][s]=0;
	while(!q.empty()){
		int x=q.top().se;
		q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=head[x];i;i=e[i].next){
			int v=e[i].to,k=e[i].del;
			if(dis[I][v]>dis[I][x]+k){
				dis[I][v]=dis[I][x]+k;
				q.push({dis[I][v],v});
			}
		}
	}
}

void topo(){
	queue<int> q;
	for(int i=1;i<=n;i++)if(!in[i])q.push(i);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=head1[x];i;i=e1[i].next){
			int v=e1[i].to,k=e1[i].del;
			in[v]--;
			len[v]=max(len[v],len[x]+k);
			if(in[v]==0)q.push(v);
		}
	}
}

signed main(){
	read(n,m);
	read(x1,y1);read(x2,y2);
	for(int i=1;i<=m;i++){
		int u,v,k;read(u,v,k);
		add(u,v,k);
		add(v,u,k);
	}
	dijkstra(x1,1);
	dijkstra(y1,2);
	dijkstra(x2,3);
	dijkstra(y2,4);
	for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=e[j].next){
			int v=e[j].to,k=e[j].del;
			if(dis[1][i]+k+dis[2][v]==dis[1][y1]&&dis[3][i]+k+dis[4][v]==dis[3][y2]){
				add1(i,v,k);
			}
		}
	}
	topo();
	int ans=0;
	for(int i=1;i<=n;i++)ans=max(ans,len[i]);
	write(ans);
	return 0;
}

www样例没过求调

2022/7/14 08:10
加载中...