救救蒟蒻,91分,#10没过,调了4个小时了
查看原帖
救救蒟蒻,91分,#10没过,调了4个小时了
685127
MaLX楼主2022/4/22 21:09
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
#include<queue>
const int ni=6e6;
void topsort();
int h[ni],e[ni],ne[ni],st[ni];
struct node{int i;long long d;};
bool operator<(node a,node b);
int idx,n,m,s1,s2,t1,t2,du[ni];
long long dis[5][ni],w[ni],ans,f[ni];
void add(int a,int b,long long c);
vector<node>touch[2000];
void solve(),dijkstra(int a,long long b[]);
int main(){solve();return 0;}
void solve(){
	scanf("%d%d%d",&n,&m,&s1);
	scanf("%d%d%d",&t1,&s2,&t2);
	memset(h,-1,sizeof(h));
	for(int i=1;i<=m;i++){
		int a,b;long long c;
		scanf("%d%d%lld",&a,&b,&c);
		add(a,b,c);add(b,a,c);
	}
	dijkstra(s1,dis[1]);
	dijkstra(s2,dis[3]);
	dijkstra(t1,dis[2]);
	dijkstra(t2,dis[4]);
	for(int i=1;i<=n;i++)
	for(int j=h[i];j!=-1;j=ne[j]){
		int k=e[j];//printf("[%d %d %lld]",i,k,w[j]);
		if(dis[1][i]+w[j]+dis[2][k]==dis[1][t1])
		if(dis[3][i]+w[j]+dis[4][k]==dis[3][t2])
		touch[i].push_back((node){k,w[j]}),du[k]++;
	}
	topsort();
	memset(f,0,sizeof(f));
	for(int i=1;i<=n;i++){
		touch[i].clear();
		for(int j=h[i];j!=-1;j=ne[j]){
			int k=e[j];
			if(dis[1][i]+w[j]+dis[2][k]==dis[1][t1])
			if(dis[4][i]+w[j]+dis[3][k]==dis[3][t2])
			touch[i].push_back((node){k,w[j]}),du[k]++;
		}
	}
	topsort();
	printf("%lld",ans);
}
void topsort(){
	queue<int>q;
	for(int i=1;i<=n;i++)if(!du[i])q.push(i);
	while(q.size()){
		int t=q.front();
		q.pop();ans=max(f[t],ans);
		for(node i:touch[t]){
			int j=i.i;long long wi=i.d;
			f[j]=max(f[j],f[t]+wi);
			if(--du[j]==0)q.push(j);
		}
	}
}
void dijkstra(int si,long long dist[]){
	priority_queue<node>q;
	memset(st,0,sizeof(st));
	fill(dist+1,dist+1+n,1e18);
	dist[si]=0;q.push((node){si,dist[si]});
	while(q.size()){
		int t=q.top().i;q.pop();
		for(int i=h[t];i!=-1;i=ne[i]){
			int j=e[i];
			if(dist[j]>dist[t]+w[i]){
				dist[j]=dist[t]+w[i];
				if(st[j]==0)st[j]=1,
				q.push((node){j,dist[j]});
			}
		}
	}
}
void add(int a,int b,long long c){
	e[idx]=b;w[idx]=c;
	ne[idx]=h[a];h[a]=idx++;
}
bool operator<(node a,node b)
{return a.d>b.d;}
2022/4/22 21:09
加载中...