#include<bits/stdc++.h> #define int long long usingnamespace std; constint N = 2e6 + 5; constint M = N * 2;
int a[N], b[N]; int f[N], siz[N];
intGet(int u){ return u == f[u] ? u : f[u] = Get(f[u]); }
structedge { int u, v, e; } e[N];
boolcmp(edge x, edge y){ return x.e < y.e; }
signedmain(){ int n; cin >> n; for (int i = 1; i < n; i++) { scanf("%lld %lld %lld", &e[i].u, &e[i].v, &e[i].e); } for (int i = 1; i <= n; i++) { f[i] = i; siz[i] = 1; } sort(e + 1, e + n, cmp); int ans = 0; for (int i = 1; i < n; i++) { edge t = e[i]; int u = t.u, v = t.v, e = t.e; u = Get(u), v = Get(v); if (siz[u] < siz[v]) swap(u, v); ans += siz[u] * siz[v] * e; f[u] = v; siz[v] += siz[u]; } cout << ans << endl; }
intfind(int x){ while (x != f[x]) { x = f[x] = f[f[x]]; } return x; }
boolsame(int x, int y){ returnfind(x) == find(y); }
boolmerge(int x, int y){ x = find(x); y = find(y); if (x == y) returnfalse; siz[x] += siz[y]; f[y] = x; returntrue; }
intsize(int x){ return siz[find(x)]; } };
vector<int> e[N];
voidsolve(){ cin >> n; string s; cin >> s; for (int i = 0; i < s.size(); i++) { if (s[i] == 'W') col[i + 1] = 1; else col[i + 1] = 0; } DSU dsu(n + 1); for (int i = 1; i <= n - 1; i++) { int u, v; cin >> u >> v; e[u].push_back(v); e[v].push_back(u); if (col[u] && col[v]) dsu.merge(u, v); } int ans = 0; for (int i = 1; i <= n; i++) { int sum = 0; if (col[i] == 0) { for (auto v : e[i]) { if (col[v] == 1) sum += dsu.siz[dsu.find(v)]; } ans = max(ans, sum + 1); } } if (ans == 0) ans = n; cout << ans << endl; }
int n, m; int a[N]; vector<int> e[N]; int fa[N], son[N], dep[N], siz[N]; int top[N];
voiddfs1(int u, int f){ fa[u] = f; siz[u] = 1; dep[u] = dep[f] + 1; for (int v : e[u]) { if (v == f) continue; dfs1(v, u); siz[u] += siz[v]; if (siz[son[u]] < siz[v]) son[u] = v; } }
voiddfs2(int u, int t){ top[u] = t; if (!son[u]) return; dfs2(son[u], t); for (int v : e[u]) { if (v == fa[u] || v == son[u]) continue; dfs2(v, v); } }
intlca(int u, int v){ while (top[u] != top[v]) { if (dep[top[u]] < dep[top[v]]) swap(u, v); u = fa[top[u]]; } return dep[u] < dep[v] ? u : v; }
voidadd(int u, int v){ e[u].push_back(v); }
structedges { int u, v, w; booloperator<(const edges &tmp) { return w > tmp.w; } };
edges edge[M];
voidsolve(){ int q; cin >> n >> m; DSU dsu(2 * n + 1); for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; edge[i] = {u, v, w}; } sort(edge + 1, edge + 1 + m); int cnt = n; for (int i = 1; i <= m; i++) { auto [u, v, w] = edge[i]; u = dsu.find(u), v = dsu.find(v); if (u != v) { cnt++; dsu.merge(cnt, u); dsu.merge(cnt, v); add(cnt, u); add(u, cnt); add(cnt, v); add(v, cnt); a[cnt] = w; } } for (int i = 1; i <= 2 * n; i++) { if (dsu.find(i) == i) { dfs1(i, 0); dfs2(i, i); } } cin >> q; for (int i = 1; i <= q; i++) { int u, v; cin >> u >> v; if (dsu.find(u) != dsu.find(v)) { cout << -1 << endl; continue; } int mid = lca(u, v); cout << a[mid] << endl; } }