Submission #1332073

#TimeUsernameProblemLanguageResultExecution timeMemory
1332073bestzuCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
2095 ms19440 KiB
#include<bits/stdc++.h>
using namespace std;
using pli = pair<long long, int>;
using pil = pair<int, long long>;
int n, m;
void dijkstra(int s, vector<long long> &dist, vector<vector<pil>> &adj) {
	dist[s] = 0;
	vector<bool> flag(n+1, false);
	priority_queue<pli, vector<pli>, greater<pli>> pq;
	pq.push({dist[s], s});
	while(!pq.empty()) {
		int uu = pq.top().second;
		pq.pop();
		
		if(flag[uu]) continue;
		
		flag[uu] = true;
		for(auto vw : adj[uu]) {
			int vv = vw.first;
			long long ww = vw.second;
			
			if(dist[vv] > dist[uu] + ww)  {
				dist[vv] = dist[uu] + ww;
				pq.push({dist[vv],  vv});
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0);
	
	const long long inf = 1000000000000007;
	
	int s, t, u, v; cin >> n >> m >> s >> t >> u >> v;
	vector<vector<pil>> adj(n+1);
	for(int i = 1; i <= m; i++) {
		int a, b;
		long long c; cin >> a >> b >> c;
		adj[a].push_back({b, c});
		adj[b].push_back({a, c});
	}
	
	// dijkstra from S
	vector<long long> distS(n+1, inf);
	dijkstra(s, distS, adj);	
	
	//dijkstra from T
	vector<long long> distT(n+1, inf);
	dijkstra(t, distT, adj);
	
	//dijkstra from U
	vector<long long> distU(n+1, inf);
	dijkstra(u, distU, adj);
	
	//dijkstra from V
	vector<long long> distV(n+1, inf);
	dijkstra(v, distV, adj);

	long long ans = 0;
	ans = distU[v];
	for(int a = 1; a <= n; a++) {
		for(int b = 1; b <= n; b++) {
			if(distS[a] + distT[a] == distS[t] && distS[b] + distT[b] == distS[t]) {
				ans = min({ans, distU[a] + distV[b], distU[b] + distV[a]});
			}
		}
	}
	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...