This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int N = 110000;
long long const inf = 1e16;
int n, m, s, t, u, v;
vector<pair<int, long long>> g[N];
vector<int> in[N], out[N];
long long min_dist[N];
long long D[N][4];
bool visited[N];
bool vst[N][4];
struct cmp{
bool operator() (pair<long long, int> a, pair<long long, int> b) {
return a.first > b.first;
}
};
struct cmp2{
bool operator() (pair<pair<long long, int>, int> a, pair<pair<long long, int>, int> b) {
return a.first.first > b.first.first;
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m >> s >> t >> u >> v;
int a, b;
long long c;
for (int i = 1; i <= m; i ++) {
cin >> a >> b >> c;
g[a].push_back({b, c});
g[b].push_back({a, c});
}
priority_queue<pair<long long, int>, vector<pair<long long, int>>, cmp> pq;
for (int i = 1; i <= n; i ++) {
min_dist[i] = inf;
}
min_dist[s] = 0;
pq.push({0, s});
while(!pq.empty()) {
auto [d, x] = pq.top();
pq.pop();
if (visited[x]) continue;
visited[x] = true;
for (pair<int, long long> e : g[x]) {
if (min_dist[e.first] > e.second + d) {
min_dist[e.first] = e.second + d;
pq.push({e.second + d, e.first});
}
}
}
queue<int> q;
q.push(t);
while (!q.empty()) {
int x = q.front();
q.pop();
for (pair<int, long long> e : g[x]) {
if (min_dist[e.first] + e.second == min_dist[x]) {
in[x].push_back(e.first);
out[e.first].push_back(x);
q.push(e.first);
}
}
}
priority_queue<pair<pair<long long, int>, int>, vector<pair<pair<long long, int>, int>>, cmp2> pq2;
for (int i = 1; i <= n; i ++) {
D[i][0] = D[i][1] = D[i][2] = D[i][3] = inf;
}
D[u][0] = 0;
pq2.push({{0, u}, 0});
while (!pq2.empty()) {
auto [p, t] = pq2.top();
auto [d, x] = p;
pq2.pop();
if (vst[x][t]) continue;
vst[x][t] = true;
if (t == 0) {
for (auto e : g[x]) {
if (D[e.first][0] > d + e.second) {
D[e.first][0] = d + e.second;
pq2.push({{d + e.second, e.first}, 0});
}
}
for (int e : out[x]) {
if (D[e][1] > d) {
D[e][1] = d;
pq2.push({{d, e}, 1});
}
}
for (int e : in[x]) {
if (D[e][2] > d) {
D[e][2] = d;
pq2.push({{d, e}, 2});
}
}
}
if (t == 1) {
for (int e : out[x]) {
if (D[e][1] > d) {
D[e][1] = d;
pq2.push({{d, e}, 1});
}
}
for (auto e : g[x]) {
if (D[e.first][3] > d + e.second) {
D[e.first][3] = d + e.second;
pq2.push({{d + e.second, e.first}, 3});
}
}
}
if (t == 2) {
for (int e : in[x]) {
if (D[e][2] > d) {
D[e][2] = d;
pq2.push({{d, e}, 2});
}
}
for (auto e : g[x]) {
if (D[e.first][3] > d + e.second) {
D[e.first][3] = d + e.second;
pq2.push({{d + e.second, e.first}, 3});
}
}
}
if (t == 3) {
for (auto e : g[x]) {
if (D[e.first][3] > d + e.second) {
D[e.first][3] = d + e.second;
pq2.push({{d + e.second, e.first}, 3});
}
}
}
}
cout << min(min(D[v][0], D[v][1]), min(D[v][2], D[v][3]));
return 0;
}
Compilation message (stderr)
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:61:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
61 | auto [d, x] = pq.top();
| ^
commuter_pass.cpp:100:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
100 | auto [p, t] = pq2.top();
| ^
commuter_pass.cpp:101:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
101 | auto [d, x] = p;
| ^
# | 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... |