Submission #1266712

#TimeUsernameProblemLanguageResultExecution timeMemory
1266712WH8Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
498 ms30904 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long 
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define maxn 100005
#define maxc 1e15
#define iii tuple<int,int,int>
int n,m,s,t,u,v,d;
vector<vector<pair<int,int>>> al(maxn);
vector<int> ds(maxn,maxc),dt(maxn,maxc),du(maxn,maxc),dv(maxn,maxc);
vector<vector<int>> mem(maxn, vector<int>(3, maxc));

void dijkstra(int start, vector<int> & dist){
	dist[start]=0;
	priority_queue<pair<int,int>, vector<pair<int,int>>,greater<pair<int,int>>> pq;
	pq.push({0, start});
	while(!pq.empty()){
		auto [cd, x] = pq.top();pq.pop();
		//~ printf("cur dist %lld  x is %lld\n", cd, x);
		if(dist[x]<cd)continue;
		for(auto [to, cost]:al[x]){
			//~ printf("to %lld, cost %lld\n",to,cost);
			if(cd+cost<dist[to]){
				dist[to]=cd+cost;
				pq.push({cd+cost, to});
			}
		}
	}
}

signed main(){
	cin>>n>>m>>s>>t>>u>>v;
	for(int i=0;i<m;i++){
		int a,b,c;cin>>a>>b>>c;
		al[a].pb({b,c});
		al[b].pb({a,c});
	}
	dijkstra(s, ds);
	dijkstra(t, dt);
	assert(dt[s]==ds[t]);
	d=dt[s];
	
	priority_queue<iii, vector<iii>,greater<iii>> pq;
	
	
	pq.push({0, u, 0});
	mem[u][0]=0;
	//0 not started, 1 in midst of, 2 exited. 
	while(!pq.empty()){
		auto [cd, x, st]=pq.top();pq.pop();
		if(mem[x][st]<cd)continue;
		for(auto [to, cost]:al[x]){
			if ((ds[x]+cost+dt[to]==d)
			and st!=2){
				if(cd<mem[to][1]){
					mem[to][1]=cd;
					pq.push({cd, to, 1});
				}
			}
			int nst=(st==1?2:st);
			if(cd+cost<mem[to][nst]){
				mem[to][nst]=cd+cost;
				pq.push({cd+cost, to, nst});
			}
		}	
	}
	int ans=maxc;
	ans=min({ans, mem[v][0], mem[v][1],mem[v][2]});
	
	for(int i=1;i<=n;i++)mem[i][0]=mem[i][1]=mem[i][2]=maxc;
	pq.push({0, u, 0});
	mem[u][0]=0;
	//0 not started, 1 in midst of, 2 exited. 
	while(!pq.empty()){
		auto [cd, x, st]=pq.top();pq.pop();
		if(mem[x][st]<cd)continue;
		for(auto [to, cost]:al[x]){
			if ((ds[to]+cost+dt[x]==d)
			and st!=2){
				if(cd<mem[to][1]){
					mem[to][1]=cd;
					pq.push({cd, to, 1});
				}
			}
			int nst=(st==1?2:st);
			if(cd+cost<mem[to][nst]){
				mem[to][nst]=cd+cost;
				pq.push({cd+cost, to, nst});
			}
		}	
	}
	ans=min({ans, mem[v][0], mem[v][1],mem[v][2]});
	cout<<ans;
	//~ cout<<"distance from s:\n";
	//~ for(int i=1;i<=n;i++){
		//~ cout<<ds[i]<<" ";
	//~ }
	//~ cout<<endl;
	//~ cout<<"distance from t:\n";
	//~ for(int i=1;i<=n;i++){
		//~ cout<<dt[i]<<" ";
	//~ }
	//~ cout<<endl;
		
	//~ cout<<"\ndistance from s:\n";
	//~ for(int i=1;i<=n;i++){
		//~ cout<<i<<": "<<mem[i][0]<<" "<<mem[i][1]<<" "<<mem[i][2]<<endl;
	//~ }
	//~ cout<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...