//gm --- akezhon
#include <bits/stdc++.h>
// #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define pb push_back
#define pf push_front
#define F first
#define S second
#define all(v) v.begin(),v.end()
#define pii pair<int,int>
#define tm (tl+tr)/2
#define TL v+v, tl, tm
#define TR v+v+1, tm+1, tr
#define DA l <= tl && tr <= r
#define NE r < tl || tr < l
#define double long double
// #define int long long
using namespace std;
const int N=2e5+7;
const int mod=1e9+7;
const int inf=2e9;
int n, m, q, k;
int ans[N];
int l[N], r[N];
pii z[N];
int p[N];
int sz[N];
vector<pii>g[N];
int d[N];
bool ok[N];
vector<pair<int,pii>>reb;
int dgt(int a){
if(a == p[a])return a;
else return p[a] = dgt(p[a]);
}
void dun(int a, int b){
a=dgt(a);
b=dgt(b);
if(a==b)return;
if(sz[a]>sz[b]){
p[b]=a;
sz[a]+=sz[b];
}
else{
p[a]=b;
sz[b]+=sz[a];
}
}
void AlemAmenov(){
cin >> n >> m;
for(int i=1; i <= m; i++){
int a, b, c;
cin >> a >> b >> c;
reb.pb({c,{a,b}});
g[a].pb({b,c});
g[b].pb({a,c});
}
cin >> k;
set<pii>st;
for(int i=1; i <= n; i++)d[i]=inf;
for(int x, i=1; i <= k; i++){
cin >> x;
d[x]=0;
st.insert({0, x});
}
while(st.size()){
int v = st.begin()->S;
st.erase(st.begin());
for(auto [u, w] : g[v]){
if(d[v]+w < d[u]){
st.erase({d[u], u});
d[u]=d[v]+w;
st.insert({d[u], u});
}
}
}
vector<pii>dist;
int mxd=0;
for(int i=1; i <= n; i++){
dist.pb({d[i], i});
mxd=max(mxd, d[i]);
}
sort(all(dist));
reverse(all(dist));
cin >> q;
for(int i=1; i <= q; i++){
l[i]=0, r[i]=mxd;
cin >> z[i].F >> z[i].S;
}
for(int op=1; op <= 30; op++){
vector<pii>v;
for(int i=1; i <= q; i++){
if(l[i] <= r[i])v.pb({(l[i]+r[i])/2, i});
}
sort(all(v));
reverse(all(v));
for(int i=1; i <= n; i++){
p[i]=i;
sz[i]=1;
ok[i]=0;
}
int cur=0;
for(auto [mid, ind] : v){
while(cur < n && mid <= dist[cur].F){
int a = dist[cur].S;
ok[a]=1;
for(auto [u, w] : g[a]){
if(ok[u])dun(u, a);
}
cur++;
}
if(dgt(z[ind].F) == dgt(z[ind].S)){
ans[ind]=mid;
l[ind]=mid+1;
}
else{
r[ind]=mid-1;
}
}
}
for(int i=1; i <= q; i ++){
cout << ans[i] << '\n';
}
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int RealName=1;
// cin >> RealNam;
// srand(time(0));
while(RealName--)
AlemAmenov();
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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |