2 条题解
-
0
#include <bits/stdc++.h> using namespace std; struct Dsu { int parent[200020]; int size[200020]; void init(int n) { for (int i = 0; i <= n; i++) { parent[i] = i; size[i] = 1; } } int find(int x) { if (parent[x] == x) { return x; } return parent[x] = find(parent[x]); } void merge(int x, int y) { x = find(x); y = find(y); if (x == y) { return; } parent[y] = x; size[x] += size[y]; } int get_size(int x) { return size[find(x)]; } }; struct Edge { int u, v; long long w; bool operator<(const Edge &rhs) { return w < rhs.w; } } edges[200020]; int main() { long long n; std::cin >> n; for (long long i = 1; i <= n - 1; ++i) { std::cin >> edges[i].u >> edges[i].v >> edges[i].w; } sort(edges + 1, edges + n); Dsu dsu; dsu.init(n); long long ans = 0; for (long long i = 1; i <= n - 1; ++i) { ans += (edges[i].w + 1) * (dsu.get_size(edges[i].u) * dsu.get_size(edges[i].v) - 1); ans += edges[i].w; dsu.merge(edges[i].u, edges[i].v); } std::cout << ans; return 0; }
信息
- ID
- 1626
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 13
- 已通过
- 6
- 上传者