#include <bits/stdc++.h>
#define SPED \
ios_base::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define endl "\n"
#define fi first
#define se second
#define lint long long
#define fami signed
#define lore main
#define freefire freopen
#define Data tuple<int, int, lint>
const lint INF = 1e15;
using namespace std;
int n, m, s, t, ss, tt, in1[100005], in2[100005];
lint sdist[100005], tdist[100005], ssdist[100005], ttdist[100005], dp1[100005], dp2[100005];
vector<pair<int, lint>> adj[100005], adj1[100005], adj2[100005];
vector<Data> edges;
void dijkstra(int z, lint dist[])
{
fill(dist + 1, dist + 1 + n, INF);
dist[z] = 0;
priority_queue<pair<lint, int>, vector<pair<lint, int>>, greater<pair<lint, int>>> pq;
pq.emplace(0, z);
while (!pq.empty())
{
auto [du, u] = pq.top();
pq.pop();
if (du > dist[u])
continue;
for (auto [v, w] : adj[u])
{
if (dist[v] > dist[u] + w)
{
dist[v] = dist[u] + w;
pq.emplace(dist[v], v);
}
}
}
}
void topo1()
{
queue<int> temp;
for (int i = 1; i <= n; i++)
{
if (in1[i] == 0)
temp.emplace(i);
dp1[i] = ssdist[i];
}
while (!temp.empty())
{
auto now = temp.front();
temp.pop();
for (auto [v, w] : adj1[now])
{
dp1[v] = min(dp1[v], dp1[now]);
--in1[v];
if (in1[v] == 0)
temp.emplace(v);
}
}
}
void topo2()
{
queue<int> temp;
for (int i = 1; i <= n; i++)
{
if (in2[i] == 0)
temp.emplace(i);
dp2[i] = ssdist[i];
}
while (!temp.empty())
{
auto now = temp.front();
temp.pop();
for (auto [v, w] : adj2[now])
{
dp2[v] = min(dp2[v], dp2[now]);
--in2[v];
if (in2[v] == 0)
temp.emplace(v);
}
}
}
fami lore()
{
SPED;
cin >> n >> m;
cin >> s >> t;
cin >> ss >> tt;
for (int i = 1; i <= m; i++)
{
int l, r;
lint w;
cin >> l >> r >> w;
adj[l].emplace_back(r, w);
adj[r].emplace_back(l, w);
edges.emplace_back(l, r, w);
}
dijkstra(s, sdist);
dijkstra(t, tdist);
dijkstra(ss, ssdist);
dijkstra(tt, ttdist);
for (auto [u, v, w] : edges)
{
if (sdist[u] + w + tdist[v] == sdist[t])
{
adj1[u].emplace_back(v, w);
in1[v]++;
adj2[v].emplace_back(u, w);
in2[u]++;
}
else if (sdist[v] + w + tdist[u] == sdist[t])
{
adj1[v].emplace_back(u, w);
in1[u]++;
adj2[u].emplace_back(v, w);
in2[v]++;
}
}
fill(dp1 + 1, dp1 + 1 + n, INF);
fill(dp2 + 1, dp2 + 1 + n, INF);
topo1();
topo2();
lint ans = ssdist[tt];
for (int i = 1; i <= n; i++)
ans = min(ans, min(dp1[i], dp2[i]) + ttdist[i]);
cout << ans;
}
// Let your soul wander where dreams are born.
# | 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... |