Submission #1247999

#TimeUsernameProblemLanguageResultExecution timeMemory
1247999vlomaczkCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
535 ms121248 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

ll M = 100'010;
vector<vector<vector<pair<pair<ll, ll>, ll>>>> g(4, vector<vector<pair<pair<ll, ll>, ll>>>(M));
vector<pair<pair<ll, ll>, ll>> edges;
ll inf = 3e15;

vector<vector<ll>> dijkstra(ll s) {
	vector<vector<ll>> dist(4, vector<ll>(M, inf));
	dist[0][s] = 0;
	priority_queue<pair<ll, pair<ll, ll>>> pq;
	pq.push({0, {s, 0}});
	while(pq.size()) {
		auto[dv, stat] = pq.top(); pq.pop();
		auto[v, msk] = stat;
		dv *= -1;
		if(dist[msk][v]!=dv) continue;
		for(auto[sr, w] : g[msk][v]) {
			auto[u, msk2] = sr;
			if(dist[msk2][u] > dv + w) {
				dist[msk2][u] = dv + w;
				pq.push({-dv-w, {u, msk2}});
			}
		}
	}
	return dist;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	ll n, m;
	cin >> n >> m;
	ll s, t, u, v;
	cin >> s >> t >> u >> v;
	for(ll i=0; i<m; ++i) {
		ll a, b, c;
		cin >> a >> b >> c;
		edges.push_back({{a, b}, c});
		g[0][a].push_back({{b, 0}, c});
		g[0][b].push_back({{a, 0}, c});
	}
	vector<ll> distS = dijkstra(s)[0];
	vector<ll> distT = dijkstra(t)[0];
	ll ans = distS[t];
	for(auto[e, d] : edges) {
		auto[a, b] = e;
		if(distS[a] + d + distT[b] == ans) {
			g[0][a].push_back({{b, 1}, 0});
			g[1][a].push_back({{b, 1}, 0});
			
			g[0][b].push_back({{a, 2}, 0});
			g[2][b].push_back({{a, 2}, 0});
		} else if(distS[b] + d + distT[a] == ans) {
			g[0][b].push_back({{a, 1}, 0});
			g[1][b].push_back({{a, 1}, 0});

			g[0][a].push_back({{b, 2}, 0});
			g[2][a].push_back({{b, 2}, 0});
		}

		g[3][a].push_back({{b, 3}, d});
		g[3][b].push_back({{a, 3}, d});

		g[1][a].push_back({{b, 3}, d});
		g[1][b].push_back({{a, 3}, d});

		g[2][a].push_back({{b, 3}, d});
		g[2][b].push_back({{a, 3}, d});
		
	}
	for(ll msk=1; msk<3; ++msk) {
		for(ll i=1; i<=n; ++i) {
			g[msk][i].push_back({{i, 3}, 0});
		}
	}
	vector<vector<ll>> dist = dijkstra(u);
	ans = inf;
	for(ll i=0; i<4; ++i) ans = min(ans, dist[i][v]);
	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...