CF1095F Make It Connected
Problem
给你
求出让这个图连通的最小代价。
Input
第一行两个整数
第二行
接下来
Output
一行一个整数表示最小代价。
Sample
Input 1
3 2
1 3 3
2 3 5
2 1 1
Output 1
5
Input 2
4 0
1 3 3 7
Output 2
16
Input 3
5 4
1 2 3 4 5
1 2 8
1 3 10
1 4 7
1 5 15
Output 3
18
Solution
首先总边数是
我们发现完全图中共有
那如何找到这
考虑将权值排序,则有
对
最后将这些边与特殊边共
代码:
#include <bits/stdc++.h>
using namespace std;
const int kmax = 2e5 + 5;
struct E {
long long x, y, w;
} a[kmax * 2];
long long f[kmax], ans, v[kmax];
int n, m, c, g = 1;
int F(int x) {
return x == f[x] ? x : f[x] = F(f[x]);
}
void U(int x, int y) {
int fx = F(x), fy = F(y);
if (fx != fy)
f[fx] = fy;
return;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> v[i];
f[i] = i;
g = (v[g] > v[i] ? i : g); // 找权值最小值
}
for (int i = 1; i <= m; i++) {
cin >> a[i].x >> a[i].y >> a[i].w;
}
for (int i = 1; i <= n; i++) {
if (g != i) { // 不能与自己连
a[i + m].x = g;
a[i + m].y = i;
a[i + m].w = v[i] + v[g]; // 建边
}
}
sort(a + 1, a + m + n + 1, [](E p, E q) { return p.w < q.w; });
for (int i = 1; i <= m + n; i++) {
int fx = F(a[i].x);
int fy = F(a[i].y);
if (fx != fy) {
c++, ans += a[i].w; // 累加答案
U(fx, fy); // 合并
}
}
cout << ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具