Submission #1114398

#TimeUsernameProblemLanguageResultExecution timeMemory
1114398nikolashamiCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
622 ms65548 KiB
#include <bits/stdc++.h>
using namespace std;

#define int int64_t
const int N=1e5+4;
vector<array<int,2>>adj[N];
vector<int>go[N],g[N],rg[N];
int dS[N],dU[N],dV[N],dT[N],dp1[N],dp2[N],ans,n,m,U,V,S,T;

void dijkstra(int p,int d[]){
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>>pq;
	fill(d,d+n+1,1e18);
	d[p]=0;
	pq.push({0,p});
	while(!pq.empty()){
		auto[dd,u]=pq.top();
		pq.pop();
		for(auto&[v,w]:adj[u]){
			if(dd+w<d[v]){
				d[v]=dd+w;
				pq.push({d[v],v});
			}
		}
	}
}

map<array<int,2>,bool>edges;

int vis[N];
void makego(int u){
	vis[u]=1;
	for(auto&[v,w]:adj[u]){
		if(edges[{min(u,v),max(u,v)}])
			continue;
		if(min(dS[u]+dT[v],dS[v]+dT[u])+w==dS[T]){
			go[u].push_back(v);
			go[v].push_back(u);
			edges[{min(u,v),max(u,v)}]=1;
		}
		if(!vis[v])
			makego(v);
	}
}	

void makedir(int u){
	vis[u]=1;
	for(int v:go[u]){
		int node1=u,node2=v;
		if(dS[node1]>dS[node2])
			swap(node1,node2);
		assert(dT[node2]<dT[node1]);
		g[node1].push_back(node2);
		rg[node2].push_back(node1);
		if(!vis[v])
			makedir(v);
	}
}

int f1(int u){
	if(dp1[u]!=-1)
		return dp1[u];
	int ret=dV[u];
	for(auto v:g[u])
		ret=min(ret,f1(v));
	return dp1[u]=ret;
}

int f2(int u){
	if(dp2[u]!=-1)
		return dp2[u];
	int ret=dV[u];
	for(auto v:rg[u])
		ret=min(ret,f2(v));
	return dp2[u]=ret;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin>>n>>m>>S>>T>>U>>V;

    for(int i=0,u,v,w;i<m;++i){
    	cin>>u>>v>>w;
    	adj[u].push_back({v,w});
    	adj[v].push_back({u,w});
    }

    dijkstra(U,dU);
    dijkstra(V,dV);
    dijkstra(T,dT);
    dijkstra(S,dS);


    makego(S);
    fill(vis,vis+N,0);
    makedir(S);

    fill(dp1,dp1+N,-1);
    fill(dp2,dp2+N,-1);
    ans=dU[V];
    
    for(int i=1;i<=n;++i)
    	if(dS[i]+dT[i]==dT[S])
    		ans=min(ans,dU[i]+min(f1(i),f2(i)));

    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...