| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1367963 | brinleyhong | Commuter Pass (JOI18_commuter_pass) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5;
const int maxm = 2e5;
const ll INF = 1e18;
int n, m, S, T, U, V;
ll d[305][305];
vector <pair<int, int>> adj[maxn+5];
void read() {
cin >> n >> m;
cin >> S >> T;
cin >> U >> V;
for (int i = 1; i<=m; ++i) {
int u, v, w; cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
}
void FW() {
for (int i = 1; i<=n; ++i) {
for (int j = 1; j<=n; ++j)
d[i][j] = (i != j ? INF : 0);
}
for (int u = 1; u<=n; ++u) {
for (pair <int, int> e : adj[u]) {
int v = e.first, w = e.second;
d[u][v] = min(d[u][v], 1LL * w);
d[v][u] = min(d[v][u], 1LL * w);
}
}
for (int k = 1; k<=n; ++k) {
for (int i = 1; i<=n; ++i) {
for (int j = 1; j<=n; ++j) {
if (d[i][k] != INF && d[k][j] != INF)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}
void sub3() {
FW();
ll res = INF;
for (int L = 1; L<=n; ++L) {
for (int R = 1; R<=n; ++R) {
if (d[L][R] + d[S][L] + d[R][T] == d[S][T]) {
res = min(res, d[U][L] + d[R][V]);
res = min(res, d[V][L] + d[R][U]);
}
}
}
// cout << (d[1][2] + d[5][1] + d[7][2] == d[5][7] ? "YES" : "NO");
// cout << d[2][6] + d[1][8];
cout << min(res, d[U][V]);
}
void solve() {
if (S == U) {
sub1();
return;
}
if (n <= 300) {
sub3();
return;
}
}
int main() {
// freopen("commuter_pass.inp", "r", stdin);
// freopen("commuter_pass.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
read();
solve();
return 0;
}
