Submission #1339938

#TimeUsernameProblemLanguageResultExecution timeMemory
1339938nicolo_010Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
252 ms19628 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int MOD = 998244353;
const int mxN = 1e5+5;
template <typename T>
using pq = priority_queue<T, vector<T>, greater<T>>;

vector<vector<pii>> adj;
vector<ll> du, dv, ds;
ll dp[mxN][2];

void dijkstra1(int s, vector<ll> &dis) {
	dis.assign(mxN, 1e18);
	pq<pair<ll, int>> q;
	q.push({0, s});
	dis[s] = 0;
	while (!q.empty()) {
		auto [w, u] = q.top();
		q.pop();
		if (w!=dis[u]) continue;
		for (auto [v, p] : adj[u]) {
			if (dis[v] > dis[u]+p) {
				dis[v] = dis[u]+p;
				q.push({dis[v], v});
			}
		}
	}
}

ll ans;

void dijkstra2(int s, int t) {
	//s es el source
	for (int i=0; i<mxN; i++) {
		dp[i][0] = dp[i][1] = 1e18;
	}
	ds.assign(mxN, 1e18);
	vector<bool> vis(mxN, false);
	pq<pair<ll, pii>> q;
	q.push({0, {s, mxN-1}});
	while (!q.empty()) {
		auto [w, e] = q.top();
		auto [u, p] = e;
		q.pop();
		if (!vis[u]) {
			vis[u] = true;
			ds[u] = w;
			dp[u][0] = min(du[u], dp[p][0]);
			dp[u][1] = min(dp[u][0] + dv[u], dp[p][1]);
			for (auto [v, peso] : adj[u]) {
				q.push({w+peso, {v, u}});
			}
		}
		else if (ds[u] == w) {
			dp[u][0] = min(dp[u][0], dp[p][0]);
			dp[u][1] = min({
				dp[u][1], dp[u][0]+dv[u], dp[p][1]
			});
		}
	}
	ans = min(ans, dp[t][1]);
}

void solve() {
	int n, m, s, t, u, v;
	cin >> n >> m >> s >> t >> u >> v;
	adj.assign(n, {});
	s--; t--; u--; v--;
	for (int i=0; i<m; i++) {
		int a, b, c; cin >> a >> b >> c;
		a--; b--;
		adj[a].push_back({b, c});
		adj[b].push_back({a, c});
	}
	dijkstra1(u, du);
	dijkstra1(v, dv);
	ans = du[v];
	dijkstra2(s, t);
	dijkstra2(t, s);
	cout << ans << "\n";
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int t=1;
	while (t--) {
		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...