#include <bits/stdc++.h>
#define int long long
#define all(v) v.begin(), v.end()
using namespace std;
const int sz = 5e5 + 1, inf = 1e18;
int n, m, qs, k, cnt, in[sz], out[sz], d[sz], u[sz], v[sz], w[sz], p[sz], dp[18][sz], mn[18][sz], road[sz];
vector<array<int, 2>> g[sz], t[sz];
int par(int x)
{
if(p[x] < 0) return x;
return p[x] = par(p[x]);
}
bool join(int u, int v)
{
u = par(u), v = par(v);
if(u == v) return 0;
if(p[u] > p[v]) swap(u, v);
p[u] += p[v];
p[v] = u;
return 1;
}
void dfs(int v, int p)
{
in[v] = ++cnt;
for(auto i : t[v])
{
int u = i[0], w = i[1];
if(u == p) continue;
road[u] = road[v] + 1;
dp[0][u] = v;
mn[0][u] = w;
dfs(u, v);
}
out[v] = cnt;
}
bool anc(int x, int y)
{
return in[x] <= in[y] && out[y] <= out[x];
}
int lca(int u, int v)
{
if(anc(u, v)) return u;
if(anc(v, u)) return v;
for(int i = 17; i >= 0; i--)
{
if(road[u] >= (1 << i) && !anc(dp[i][u], v)) u = dp[i][u];
}
return dp[0][u];
}
int get(int u, int v)
{
int cm = lca(u, v);
int du = road[u] - road[cm];
int dv = road[v] - road[cm];
int res = inf;
for(int i = 0; i < 18; i++)
{
if((1 << i) & du)
{
res = min(res, mn[i][u]);
u = dp[i][u];
}
}
for(int i = 0; i < 18; i++)
{
if((1 << i) & dv)
{
res = min(res, mn[i][v]);
v = dp[i][v];
}
}
return res;
}
void solve()
{
in[0] = inf;
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
cin >> u[i] >> v[i] >> w[i];
g[u[i]].push_back({v[i], w[i]});
g[v[i]].push_back({u[i], w[i]});
}
set<array<int, 2>> q;
fill(d + 1, d + 1 + n, inf);
cin >> k;
for(int i = 1; i <= k; i++)
{
int npp;
cin >> npp;
q.insert({0, npp});
d[npp] = 0;
}
while(!q.empty())
{
int v = (*q.begin())[1];
q.erase(q.begin());
for(auto i : g[v])
{
int u = i[0], w = i[1];
if(d[u] > d[v] + w)
{
q.erase({d[u], u});
d[u] = d[v] + w;
q.insert({d[u], u});
}
}
}
vector<array<int, 3>> e;
for(int i = 1; i <= m; i++)
{
w[i] = min(d[u[i]], d[v[i]]);
e.push_back({w[i], u[i], v[i]});
}
sort(all(e), greater<array<int, 3>>());
fill(p + 1, p + 1 + n, -1);
for(auto ex : e)
{
if(join(ex[1], ex[2]))
{
t[ex[1]].push_back({ex[2], ex[0]});
t[ex[2]].push_back({ex[1], ex[0]});
}
}
for(int i = 0; i < 18; i++) for(int j = 1; j <= n; j++) mn[i][j] = inf;
dfs(1, 0);
for(int i = 1; i < 18; i++)
{
for(int j = 1; j <= n; j++)
{
if(road[j] >= (1 << i))
{
dp[i][j] = dp[i - 1][dp[i - 1][j]];
mn[i][j] = min(mn[i - 1][j], mn[i - 1][dp[i - 1][j]]);
}
}
}
cin >> qs;
while(qs--)
{
int s, t;
cin >> s >> t;
cout << get(s, t) << '\n';
}
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while(t--) solve();
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |