#include <iostream>
#include <vector>
using namespace std;
const int N = 1e6 + 9;
const int inf = 0x3f3f3f3f;
vector<int>G[N];
int f[N];
int Find(int x) {return f[x] == x?x:f[x] = Find(f[x]);}
int V[N];
int sz[N];
int fa[N][20];
void dfs(int u, int father) {
fa[u][0] = father;
for (int i = 1; i <= 17; i++) {
fa[u][i] = fa[fa[u][i-1]][i-1];
}
for (auto v : G[u]) {
if (father == v)continue;
dfs(v, u);
sz[u] += sz[v];
}
if (sz[u] == 0)sz[u]++;
return ;
}
bool check(int x, int y, int mid, int cnt) {
for (int i = 17; i >= 0; i--) {
if (V[fa[x][i]] <= mid)x = fa[x][i];
if (V[fa[y][i]] <= mid)y = fa[y][i];
}
int t = 0;
if (x == y) t = sz[x];
else t = sz[x] + sz[y];
if (t < cnt)return 1;
else return 0;
}
int main() {
int n, m;
ios::sync_with_stdio(0);
cin >> n >> m;
for (int i = 1; i <= n + n; i++)f[i] = i;
int cnt = 0;
V[0] = inf;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v;
int fx = Find(u);
int fy = Find(v);
if (fx != fy && cnt <= n-1){
cnt++;
int node = n + cnt;
V[node] = i;
G[node].push_back(fx);
G[node].push_back(fy);
f[fx] = node;
f[fy] = node;
}
}
dfs(n + cnt, 0);
int q;
cin >> q;
while (q--) {
int u, v, z;
cin >> u >> v >> z;
int l = 0, r = n* 2;
int ans;
while (l < r) {
int mid = l + r >> 1;
if (check(u, v, mid, z)) {
l = mid + 1;
} else {
ans = r;r = mid;
}
}
cout << l << endl;
}
}
原文:https://www.cnblogs.com/Xiao-yan/p/14339128.html