Codeforces 437D The Child and Zoo
先是我们看到题目中让我们处理点权,但是我们发现并不好处理
所以就先化点为边
把每一条边的边权视作边所连接的两个点的值
然后我们看到这个题有路径的问题,就先还是要较大的
可以比较显然地想到最大生成树
在中改一下排序方式就行了
然后我们看到不是生成树上的边都我们在考虑走的时候都不会考虑
考虑每一个树边的贡献
连接两个联通块的时候
这一条边会产生的贡献
然后就是并查集完事
Code
const int N = 1e5 + 10;
const int M = 1e6 + 10;
struct node {
int from, to, dis;
bool operator<(const node &x) { return dis > x.dis; }
} e[M];
int n, m, val[N], sz[N], cnt, tot, fa[N];
inline void add(int u, int v, int w) {
e[++cnt].dis = w;
e[cnt].from = u;
e[cnt].to = v;
return;
}
inline int find(int x) { return fa[x] == x ? fa[x] : fa[x] = find(fa[x]); }
int u, v, w, ans;
signed main() {
n = read();
m = read();
for (int i = 1; i <= n; ++i) fa[i] = i, sz[i] = 1;
for (int i = 1; i <= n; ++i) val[i] = read();
for (int i = 1; i <= m; ++i) u = read(), v = read(), add(u, v, min(val[u], val[v]));
sort(e + 1, e + m + 1);
for (int i = 1; i <= m; ++i) {
int x = find(e[i].from), y = find(e[i].to);
if (x == y)
continue;
fa[x] = y;
tot++;
ans += sz[x] * sz[y] * e[i].dis;
sz[y] += sz[x];
if (tot == n - 1)
break;
}
ans *= 2;
double x = n * (n - 1);
printf("%.8lf", (double)ans / x);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律