제출 #388696

#제출 시각아이디문제언어결과실행 시간메모리
388696VlatkoCommuter Pass (JOI18_commuter_pass)C++14
31 / 100
416 ms20344 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pli = pair<ll, int>;

const ll inf = 1e18;
const int N = 100100;

int n, m, S, T, U, V;
vector<pli> adj[N];
ll ans;
bool vis[N];
ll distU[N];
ll distV[N];
ll dist[N];
ll dpU[N];
ll dpV[N];

void dijkstra(int source, ll dist[N]) {
	priority_queue<pli, vector<pli>, greater<pli>> pq;
	for (int i = 1; i <= n; ++i) {
		dist[i] = inf;
		vis[i] = false;
	}
	dist[source] = 0;
	pq.emplace(0, source);
	while (!pq.empty()) {
		int u = pq.top().second;
		pq.pop();
		if (vis[u]) continue;
		vis[u] = true;
		for (pli to : adj[u]) {
			ll alt = dist[u] + to.first;
			int v = to.second;
			if (alt < dist[v]) {
				dist[v] = alt;
				pq.emplace(alt, v);
			}
		}
	}
}

void dijkstra2() {
	priority_queue<pli, vector<pli>, greater<pli>> pq;
	for (int i = 1; i <= n; ++i) {
		dist[i] = inf;
		vis[i] = false;
	}
	dist[S] = 0;
	dpU[S] = distU[S];
	dpV[S] = distV[S];
	pq.emplace(0, S);
	while (!pq.empty()) {
		int u = pq.top().second;
		pq.pop();
		if (vis[u]) continue;
		vis[u] = true;
		for (pli to : adj[u]) {
			ll alt = dist[u] + to.first;
			int v = to.second;
			if (alt < dist[v]) {
				dist[v] = alt;
				dpU[v] = min(dpU[u], distU[v]);
				dpV[v] = min(dpV[u], distV[u]);
				pq.emplace(alt, v);
			} else if (alt == dist[v]) {
				dpU[v] = min(dpU[u], distU[v]);
				dpV[v] = min(dpV[u], distV[u]);
			}
		}
	}
	ans = min(ans, dpU[T] + dpV[T]);
}

int main() {
	cin.tie(0)->sync_with_stdio(false);
//	#ifndef _DEBUG
//	freopen("piepie.in", "r", stdin);
//	freopen("piepie.out", "w", stdout);
//	#endif
	cin >> n >> m >> S >> T >> U >> V;
	for (int i = 0; i < m; ++i) {
		int a, b, w;
		cin >> a >> b >> w;
		adj[a].emplace_back(w, b);
		adj[b].emplace_back(w, a);
	}
	dijkstra(U, distU);
	dijkstra(V, distV);
	ans = distV[U];
	for (int i = 0; i < 2; ++i) {
		dijkstra2();
		swap(U, V);
		swap(distU, distV);
	}
	cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...