#include <bits/stdc++.h>
/*
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC target ("avx2")
*/
using namespace std;
/*
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
*/
#define F first
#define S second
#define pb push_back
#define md(a) ((a%m+m)%m)
#define all(a) a.begin(), a.end()
#define MP make_pair
#define lc (id<<1)
#define rc (lc|1)
#define mid (l+r)/2
#define kill(a) cout << a << "\n", exit(0)
#define SZ(a) (ll)a.size()
typedef pair<int,int> pii;
typedef pair<long long ,long long> pll;
typedef long long ll;
typedef long double ld;
typedef vector<vector<ll>> matrix;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll const maxn=5e5+10, mod=1e9+7, INF=1e18, LOG=31, sq=65;
ll poww(ll a, ll b, ll mod) {
if (b == 0) return 1;
return 1 * poww(1 * a * a % mod, b / 2, mod) * ((b % 2 == 1) ? a : 1) % mod;
}
ll n, m, q, k, P[maxn], sz[maxn], par[LOG][maxn], mn[LOG][maxn], dis[maxn], h[maxn];
vector<pll> g[maxn], adj[maxn];
vector<pair<ll, pll>> E;
priority_queue<pll> pq;
//<MST>
void DSU()
{
for(ll i=0;i<maxn;i++){
P[i]=i;
sz[i]=1;
}
}
ll Find(ll v)
{
return P[v]==v?v:v=Find(P[v]);
}
bool Union(ll v, ll u)
{
if((v=Find(v))==(u=Find(u))) return 0;
if(sz[v]<sz[u]) swap(v, u);
P[u]=v;
sz[v]+=sz[u];
return 1;
}
//</MST>
//<Dij>
void Dij()
{
while(SZ(pq))
{
auto [d, v]=pq.top();
pq.pop();
d=-d;
if(d!=dis[v]) continue;
for(auto [u, w]:g[v])
{
if(dis[u]>dis[v]+w)
{
dis[u]=dis[v]+w;
pq.push({-dis[u], u});
}
}
}
}
//</Dij>
// <LCA>
void DFS(ll v, ll p=0)
{
for(auto [u, w]:adj[v])
{
if(u!=p)
{
h[u]=h[v]+1;
DFS(u, v);
par[0][u]=v;
mn[0][u]=w;
}
}
}
void Set_Par()
{
for(ll i=1;i<LOG;i++)
{
for(ll j=1;j<=n;j++)
{
par[i][j]=par[i-1][par[i-1][j]];
mn[i][j]=min(mn[i-1][j], mn[i-1][par[i-1][j]]);
}
}
}
pll Jump(ll v, ll r)
{
ll ans=INF;
for(ll i=LOG-1;i>=0;i--)
{
if(r&(1ll<<i)) {
ans=min(ans, mn[i][v]);
v=par[i][v];
}
}
return {v, ans};
}
ll LCA(ll v, ll u)
{
ll ans=INF;
if(h[v]<h[u]) swap(v, u);
ans=min(ans, Jump(v, h[v]-h[u]).S);
v=Jump(v, h[v]-h[u]).F;
if(v==u) return ans;
for(ll i=LOG-1;i>=0;i--)
{
if(par[i][v]!=par[i][u])
{
ans=min(ans, mn[i][v]);
ans=min(ans, mn[i][u]);
v=par[i][v];
u=par[i][u];
}
}
ans=min(ans, mn[0][v]);
return ans;
}
// </LCA>
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n>>m;
for(ll i=1;i<=m;i++)
{
ll v, u, w;
cin>>v>>u>>w;
g[v].pb({u, w});
g[u].pb({v, w});
E.pb({0, {v, u}});
}
cin>>k;
fill(dis, dis+maxn, INF);
for(ll i=1;i<=k;i++)
{
ll v;
cin>>v;
dis[v]=0;
pq.push({0, v});
}
Dij();
for(ll i=0;i<m;i++){
E[i].F=min(dis[E[i].S.F], dis[E[i].S.S]);
// cout<<E[i].F<<" "<<E[i].S.F<<" "<<E[i].S.S<<"+++++++++\n";
}
DSU();
sort(all(E));
reverse(all(E));
for(auto t:E)
{
ll v=t.S.F, u=t.S.S, w=t.F;
if(Union(v, u)){
adj[v].pb({u, w});
adj[u].pb({v, w});
}
}
for(ll i=1;i<=n;i++) for(ll j=0;j<LOG;j++) mn[j][i]=INF;
DFS(1);
Set_Par();
cin>>q;
while(q--)
{
ll v, u;
cin>>v>>u;
cout<<LCA(v, u)<<"\n";
}
}
# | 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... |