标签:sz int 边权 ans Zoo edges Child cf437 点权
题意:
给定带点权、无自环和重边的连通无向图,定义一条路径的价值为经过的最小点权,定义 \(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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。