2 条题解

  • 0
    @ 2025-1-20 14:23:31

    #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
    上传者