이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#pragma GCC optimize("Ofast")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <stdio.h>
#include <cstdio>
#include <math.h>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <deque>
#include <random>
#include <iomanip>
#include <bitset>
using namespace std;
template<typename T> void uin(T &a, T b) {
if (b < a) {
a = b;
}
}
template<typename T> void uax(T &a, T b) {
if (b > a) {
a = b;
}
}
#define int long long
#define left left228
#define right right228
#define prev prev228
#define list list228
#define mp make_pair
#define all(v) v.begin(), v.end()
#define forn(i, n) for (int i = 0; i < (int)n; ++i)
#define firn(i, n) for (int i = 1; i < (int)n; ++i)
#define x first
#define y second
const int N = 100 * 1000 + 228;
const int INF = 1e18 + 228;
pair<int, int> ds[N], dt[N];
int n, m, s, t, U, V;
vector< pair<int, int> > g[N];
vector<int> find(int a) {
vector<int> d(n + 1);
for (int i = 1; i <= n; ++i) {
d[i] = INF;
}
d[a] = 0;
priority_queue< pair<int, int> > q;
q.push({0, a});
pair<int, int> p;
while (!q.empty()) {
p = q.top();
q.pop();
int v = p.second;
for (pair<int, int> go : g[v]) {
int to = go.first, w = go.second;
if (d[v] + w < d[to]) {
d[to] = d[v] + w;
q.push({-d[to], to});
}
}
}
return d;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
cin >> s >> t;
cin >> U >> V;
for (int i = 0; i < m; ++i) {
int u, v, c;
cin >> u >> v >> c;
g[u].push_back({v, c});
g[v].push_back({u, c});
}
vector<int> du = find(U);
vector<int> dv = find(V);
for (int i = 1; i <= n; ++i) {
ds[i] = dt[i] = {INF, INF};
}
ds[s] = {0, dv[s]};
priority_queue< pair< pair<int, int>, int> > q;
q.push({{0, -dv[s]}, s});
while (!q.empty()) {
pair< pair<int, int> , int> p = q.top();
q.pop();
int v = p.second;
for (pair<int, int> go : g[v]) {
int to = go.first, w = go.second;
if (ds[v].first + w < ds[to].first || (ds[v].first + w == ds[to].first && min(ds[v].second, dv[to]) < ds[to].second)) {
ds[to].first = ds[v].first + w;
ds[to].second = min(ds[v].second, dv[to]);
q.push({{-ds[to].first, -ds[to].second}, to});
}
}
}
while (!q.empty()) {
q.pop();
}
dt[t] = {0, dv[t]};
q.push({{0, -dv[t]}, t});
while (!q.empty()) {
pair< pair<int, int> , int> p = q.top();
q.pop();
int v = p.second;
for (pair<int, int> go : g[v]) {
int to = go.first, w = go.second;
if (dt[v].first + w < dt[to].first || (dt[v].first + w == dt[to].first && min(dt[v].second, dv[to]) < dt[to].second)) {
dt[to].first = dt[v].first + w;
dt[to].second = min(dt[v].second, dv[to]);
q.push({{-dt[to].first, -dt[to].second}, to});
}
}
}
int res = du[V];
for (int i = 1; i <= n; ++i) {
if (ds[i].first + dt[i].first == ds[t].first) {
int cur = du[i] + min(ds[i].second, dt[i].second);
uin(res, cur);
}
}
cout << res << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |