其他分享
首页 > 其他分享> > cf437 D. The Child and Zoo

cf437 D. The Child and Zoo

作者:互联网

题意:

给定带点权、无自环和重边的连通无向图,定义一条路径的价值为经过的最小点权,定义 \(f(u,v)\) 为 \(u\) 到 \(v\) 的价值最大的路径的价值。求 \(\frac{\sum\limits_{u\neq v} f(u,v)}{n(n-1)}\)

思路:

把点权转成边权:一条边的边权为两端点点权的最小值

然后用并查集求最大生成树。最大生成树中的每一条边的贡献为该边的边权乘 它所连接的两个连通块(即并查集)的大小之积

int n, m, a[N]; vector<array<int,3>> edges;
int sz[N], p[N];
void sol() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];
    while(m--) {
        int x, y; cin >> x >> y;
        edges.pb({x,y,min(a[x],a[y])});
    }

    for(int i = 1; i <= n; i++) p[i] = i, sz[i] = 1;

    sort(all(edges), [](array<int,3> a, array<int,3> b) {
        return a[2] > b[2];
    });

    db ans = 0;
    for(auto &[x,y,w]: edges) {
        x = get(x), y = get(y);
        if(x == y) continue;
        ans += 2.0 * w * sz[x] * sz[y];
        p[y] = x, sz[x] += sz[y]; //merge
    }
    cout << fixed << setprecision(9) << ans/n/(n-1);
}

标签:sz,int,边权,ans,Zoo,edges,Child,cf437,点权
来源: https://www.cnblogs.com/wushansinger/p/16356805.html