이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pii pair<ll, ll>
using namespace std;
const ll inf = 1e17;
const int ar = 1e5 + 5;
const int mod = 1e9 + 7;
int n, m, s, t, u, v;
vector<pii> a[ar];
vector<ll> vv(ar, inf), ss(ar, inf), uu(ar, inf), tt(ar, inf);
vector<ll> u1(ar, inf), u2(ar, inf), v1(ar, inf), v2(ar, inf);
void dijkstra(ll s, vector<ll> &d)
{
d[s] = 0;
priority_queue<pii, vector<pii>, greater<pii>> Q;
Q.push({0, s});
while (!Q.empty())
{
pii Top = Q.top();
Q.pop();
ll u = Top.se, kc = Top.fi;
if (kc > d[u])
continue;
for (auto it : a[u])
{
ll v = it.fi, w = it.se;
if (d[v] > d[u] + w)
{
d[v] = d[u] + w;
Q.push({d[v], v});
}
}
}
}
void dijkstra2(ll s, vector<ll> &d)
{
d[s] = 0;
priority_queue<pii, vector<pii>, greater<pii>> Q;
Q.push({0, s});
while (!Q.empty())
{
pii Top = Q.top();
Q.pop();
ll u = Top.se, kc = Top.fi;
if (kc > d[u])
continue;
for (auto it : a[u])
{
ll v = it.fi, w = it.se;
if (d[v] > d[u] + w)
{
d[v] = d[u] + w;
Q.push({d[v], v});
u2[v] = min(u2[u], uu[v]);
v2[v] = min(v2[u], vv[v]);
}
else if (d[v] == d[u] + w)
{
u2[v] = min(u2[v], u1[u]);
v2[v] = min(v2[v], v1[u]);
}
}
}
}
void dijkstra1(ll s, vector<ll> &d)
{
d[s] = 0;
priority_queue<pii, vector<pii>, greater<pii>> Q;
Q.push({0, s});
while (!Q.empty())
{
pii Top = Q.top();
Q.pop();
ll u = Top.se, kc = Top.fi;
if (kc > d[u])
continue;
for (auto it : a[u])
{
ll v = it.fi, w = it.se;
if (d[v] > d[u] + w)
{
d[v] = d[u] + w;
Q.push({d[v], v});
u1[v] = min(u1[u], uu[v]);
v1[v] = min(v1[u], vv[v]);
}
else if (d[v] == d[u] + w)
{
u1[v] = min(u1[v], u1[u]);
v1[v] = min(v1[v], v1[u]);
}
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m >> s >> t >> u >> v;
for (int i = 1; i <= m; ++i)
{
int x, y, w;
cin >> x >> y >> w;
a[x].push_back({y, w});
a[y].push_back({x, w});
}
dijkstra(u, uu);
dijkstra(v, vv);
for (int i = 1; i <= n; i++)
{
u1[i] = u2[i] = uu[i];
v1[i] = v2[i] = vv[i];
}
dijkstra1(s, ss);
dijkstra2(t, tt);
ll ans = uu[v];
for (int i = 1; i <= n; i++)
if (ss[i] + tt[i] == ss[t])
ans = min({ans, u1[i] + v2[i], u2[i] + v1[i]});
cout << ans;
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... |