제출 #1241992

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

#define fi first
#define se second

#define int long long

const int MX = 2e5 + 5;
const int MOD = 1e9 + 7;

int n, m, s, t, u, v;
vector<pair<int, int>> adj[MX];

int Ls[MX], Lt[MX];

void dijkstra(int i1, int L[]) {
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
	for (int i = 1; i <= n; i++) L[i] = 1e18;
	L[i1] = 0;
	q.push({L[i1], i1});
	while (!q.empty()) {
		int u = q.top().se;
		int du = q.top().fi;
		q.pop();
		if (du != L[u]) continue;
		for (auto it : adj[u]) {
			int v = it.se;
			int uv = it.fi;
			if (du + uv < L[v]) {
				L[v] = du + uv;
				q.push({L[v], v});
			}
		}
	}
}

int dp[MX][3]; // 0 chua dung // 1 dang dung` // 2 da~ dung`

signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	// int test; cin>>test; while (test--) {}	
	cin >> n >> m >> s >> t >> u >> v;
	for (int i = 1; i <= m; i++) {
		int u1, v1, c1;
		cin >> u1 >> v1 >> c1;
		adj[u1].push_back({c1, v1});
		adj[v1].push_back({c1, u1});
	}
	dijkstra(s, Ls);
	dijkstra(t, Lt);
	// dp[u][0 1 2]
	// dang o dinh u 
	// 0: chua dung` duong chung
	// 1: dang tren duong chung
	// 2: da su dung xong duong chung
	priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> q;
	for (int i = 1; i <= n; i++) {
		dp[i][0] = dp[i][1] = dp[i][2] = 1e18;
	}
	dp[u][0] = 0;
	q.push({dp[u][0], {u, 0}});
	while (!q.empty()) {
		int du = q.top().fi;
		int u = q.top().se.fi;
		int now = q.top().se.se;
		q.pop();
		if (du != dp[u][now]) continue;
		if (now == 0 && dp[u][1] > du) {
			dp[u][1] = du;
			q.push({dp[u][1], {u, 1}});
		}
		if (now == 1 && dp[u][2] > du) {
			dp[u][2] = du;
			q.push({dp[u][2], {u, 2}});
		}
		for (auto it : adj[u]) {
			int v = it.se;
			int uv = it.fi;
			// dp[v][0];
			if (now == 0 || now == 2) {
				if (dp[v][now] > du + uv) {
					dp[v][now] = du + uv;
					q.push({dp[v][now], {v, now}});
				}
			}
			else if (now == 1) {
				if (Ls[u] + uv + Lt[v] == Ls[t] && dp[v][1] > du) {
					dp[v][1] = du;
					q.push({dp[v][1], {v, 1}});
				}
			}
		}
	}
	int fn = min({dp[v][0], dp[v][1], dp[v][2]});
	// cout << dp[v][0] << ' ' << dp[v][1] << ' ' << dp[v][2] << '\n';
	for (int i = 1; i <= n; i++) {
		dp[i][0] = dp[i][1] = dp[i][2] = 1e18;
	}
	dp[u][0] = 0;
	q.push({dp[u][0], {u, 0}});
	while (!q.empty()) {
		int du = q.top().fi;
		int u = q.top().se.fi;
		int now = q.top().se.se;
		q.pop();
		if (du != dp[u][now]) continue;
		if (now == 0 && dp[u][1] > du) {
			dp[u][1] = du;
			q.push({dp[u][1], {u, 1}});
		}
		if (now == 1 && dp[u][2] > du) {
			dp[u][2] = du;
			q.push({dp[u][2], {u, 2}});
		}
		for (auto it : adj[u]) {
			int v = it.se;
			int uv = it.fi;
			// dp[v][0];
			if (now == 0 || now == 2) {
				if (dp[v][now] > du + uv) {
					dp[v][now] = du + uv;
					q.push({dp[v][now], {v, now}});
				}
			}
			else if (now == 1) {
				if (Ls[v] + uv + Lt[u] == Ls[t] && dp[v][1] > du) {
					dp[v][1] = du;
					q.push({dp[v][1], {v, 1}});
				}
			}
		}
	}
	fn = min({fn, dp[v][0], dp[v][1], dp[v][2]});
	cout << fn;
	return 0;
}
// binhtinhtutinkhongcaycunhungmotkhikhongcontutinnualatuyetvong
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...