제출 #1152070

#제출 시각아이디문제언어결과실행 시간메모리
1152070pinbuCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
465 ms23556 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 100005;
const long long oo = 1e18;

int n, m, s1, t1, s2, t2;
vector<pair<int, long long>> adj[N];
long long ds[N], dt[N], dd[N][3];
void Dijkstra(int st, long long d[]) {
	for (int u = 1; u <= n; u++) d[u] = oo;
	d[st] = 0;
	priority_queue<pair<long long, int>> pq;
	pq.emplace(0, st);
	while (pq.size()) {
		int u; long long di; tie(di, u) = pq.top();
		di = -di;
		pq.pop();
		if (d[u] != di) continue;
		for (auto V: adj[u]) {
			int v; long long w; tie(v, w) = V;
			if (d[v] > di + w) {
				pq.emplace(-(d[v] = di + w), v);
			}
		}
	}
}
void Dijkstra21(void) {
	for (int u = 1; u <= n; u++) dd[u][0] = dd[u][1] = dd[u][2] = oo;
	dd[s2][0] = 0;
	priority_queue<pair<long long, pair<int, int>>> pq;
	pq.push({0, {s2, 0}});
	while (pq.size()) {
		int u = pq.top().second.first, b = pq.top().second.second; long long di = -pq.top().first;
		pq.pop();
		if (dd[u][b] != di) continue;
		if (b < 2) {
			if (dd[u][b + 1] > di) {
				pq.push({-(dd[u][b + 1] = di), {u, b + 1}});
			}
		}
		for (auto V: adj[u]) {
			int v; long long w; tie(v, w) = V;
			if (b != 1) {
				if (dd[v][b] > di + w) {
					pq.push({-(dd[v][b] = di + w), {v, b}});
				}
			} else {
				if (ds[u] + w + dt[v] == ds[t1] && dd[v][1] > di) {
					pq.push({-(dd[v][1] = di), {v, 1}});
				}
			}
		}
	}
}
void Dijkstra22(void) {
	for (int u = 1; u <= n; u++) dd[u][0] = dd[u][1] = dd[u][2] = oo;
	dd[s2][0] = 0;
	priority_queue<pair<long long, pair<int, int>>> pq;
	pq.push({0, {s2, 0}});
	while (pq.size()) {
		int u = pq.top().second.first, b = pq.top().second.second; long long di = -pq.top().first;
		pq.pop();
		if (dd[u][b] != di) continue;
		if (b < 2) {
			if (dd[u][b + 1] > di) {
				pq.push({-(dd[u][b + 1] = di), {u, b + 1}});
			}
		}
		for (auto V: adj[u]) {
			int v; long long w; tie(v, w) = V;
			if (b != 1) {
				if (dd[v][b] > di + w) {
					pq.push({-(dd[v][b] = di + w), {v, b}});
				}
			} else {
				if (ds[v] + w + dt[u] == ds[t1] && dd[v][1] > di) {
					pq.push({-(dd[v][1] = di), {v, 1}});
				}
			}
		}
	}
}
void solve(void) {
	cin >> n >> m >> s1 >> t1 >> s2 >> t2;
	for (int i = 1, a, b, w; i <= m; i++) {
		cin >> a >> b >> w;
		adj[a].emplace_back(b, w);
		adj[b].emplace_back(a, w);
	}
	Dijkstra(s1, ds); Dijkstra(t1, dt);
	long long ans = oo;
	Dijkstra21(); ans = min(ans, dd[t2][2]);
	Dijkstra22(); ans = min(ans, dd[t2][2]);
	cout << ans;
}

signed main(void) {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    
    int TEST = 1;
    while (TEST--) solve();
    
    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...