Submission #1196799

#TimeUsernameProblemLanguageResultExecution timeMemory
1196799korticzCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
190 ms22812 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ve,ed,s,t,u,v,a,b,c,ans;
vector<vector<pair<int,int>>> adj;
vector<int> distU,distV,distS;
vector<bool> visited;
vector<vector<int>> dp;
struct edge{
	int weight,node,parent;
	bool operator<(const edge&other) const{
		return weight>other.weight;
	}
};
void dijkstra (int st,vector<int>& dist) {
	dist[st]=0;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
	pq.push({0,st});
	while(!pq.empty()) {
		auto[w,now]=pq.top();
		pq.pop();
		for (auto&[tow,to]:adj[now]) {
			if (dist[to]>tow+w) {
				dist[to]=tow+w;
				pq.push({tow+w,to});
			}
		}
	}
}

void dijkstra2 (int st,int en) {
	visited.assign(ve+1,false);
	dp.assign(2,vector<int>(ve+1,LLONG_MAX));
	distS.assign(ve+1,LLONG_MAX);
	visited.assign(ve+1,false);
	priority_queue<edge> pq;
	distS[st]=0;
	pq.push({0,st,0});
	while(!pq.empty()) {
		auto[w,now,par]=pq.top();
		pq.pop();
		if (w>distS[now]) continue;
		if (!visited[now]) {
			visited[now]=true;
			distS[now]=w;
			dp[0][now]=min(dp[0][par],distU[now]);
			dp[1][now]=min(dp[1][par],distV[now]);
			for (auto&[tow,to]:adj[now]) {
			   if (distS[to]>=tow+w) {
				  pq.push({tow+w,to,now});
			   }
		  }
		}
		else if (w==distS[now]) {
			int l=min(dp[0][par],distU[now]),r=min(dp[1][par],distV[now]);
			if (l+r<dp[0][now]+dp[1][now]) {
				dp[0][now]=l;
				dp[1][now]=r;
			}
		}
	}
	ans=min(ans,dp[0][en]+dp[1][en]);
}

signed main() {
	cin.tie(0)->sync_with_stdio(0);
	cin>>ve>>ed>>s>>t>>u>>v;
	adj.resize(ve+1);
	distU.assign(ve+1,LLONG_MAX);
	distV.assign(ve+1,LLONG_MAX);
	distS.assign(ve+1,LLONG_MAX);
	for (int i=0;i<ed;i++) {
		cin>>a>>b>>c;
		adj[a].push_back({c,b});
		adj[b].push_back({c,a});
	}
	dijkstra(u,distU);
	dijkstra(v,distV);
	ans=distU[v];
	dijkstra2(s,t);
	dijkstra2(t,s);
	cout<<ans<<'\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...