#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define ppb pop_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
const char nl = '\n';
const int inf = 1e9;
struct DSU {
vector<int> par, sz;
DSU (int n){
par.resize(n+1);
sz.assign(n+1, 1);
iota(par.begin(), par.end(), 0);
}
int find(int x){
if (par[x] == x) return x;
return par[x] = find(par[x]);
}
bool uni(int a, int b){
a = find(a), b = find(b);
if (a == b) return 0;
if (sz[a] < sz[b]) swap(a, b);
sz[a] += par[b], par[b] = a;
return 1;
}
bool is(int a, int b){
return find(a) == find(b);
}
};
void solve(){
int n, m, u, v, w;
cin >> n >> m;
vector<vector<vector<int>>> adj(n+1);
vector<vector<int>> ed;
for (int i = 0; i < m; i++){
cin >> u >> v >> w;
adj[u].pb({v, w});
adj[v].pb({u, w});
ed.pb({u, v});
}
vector<int> dis(n+1, inf);
set<vector<int>> s;
int k; cin >> k;
for (int i = 1; i <= k; i++){
cin >> u;
dis[u] = 0;
s.insert({0, u});
}
while (s.size()){
int cur = s.begin()->at(1), d = s.begin()->at(0);
s.erase(s.begin());
if (d != dis[cur]) continue;
for (auto ch : adj[cur]){
if (dis[ch[0]] > dis[cur]+ch[1]){
dis[ch[0]] = dis[cur]+ch[1];
s.insert({dis[ch[0]], ch[0]});
}
}
}
for (int i = 0; i < m; i++){
ed[i].pb(min(dis[ed[i][0]], dis[ed[i][1]]));
swap(ed[i][0], ed[i][2]);
}
sort(ed.begin(), ed.end());
reverse(ed.begin(), ed.end());
int q; cin >> q;
vector<vector<int>> qu;
for (int i = 1; i <= q; i++){
cin >> u >> v;
qu.pb({0, inf, -1, u, v});
}
int it = 30;
while (it--){
vector<vector<int>> lst;
for (int i = 0; i < q; i++){
if (qu[i][0] > qu[i][1]) continue;
int mid = (qu[i][0]+qu[i][1])/2;
lst.pb({mid, i});
}
sort(lst.rbegin(), lst.rend());
DSU dsu(n);
int id = 0;
for (auto ch : lst){
int a = ch[1];
while (id < m && ed[id][0] >= ch[0]){
dsu.uni(ed[id][1], ed[id][2]);
id++;
}
if (dsu.is(qu[a][3], qu[a][4])){
qu[a][2] = ch[0];
qu[a][0] = ch[0]+1;
}
else {
qu[a][1] = ch[0]-1;
}
}
}
for (int i = 0; i < q; i++){
cout << qu[i][2] << nl;
}
}
int 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... |