用c++完成:给出一个无向图,求出最小生成树,如果该图不连通,则输出No【测试用例:物联网工程16级陈霄】 输入格式: 第一行包含两个整数N、M,表示该图共有N个结点(编号1-N)和M条无向边。(N<=5000,M<=100000) 接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi 输出格式: 输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出No 输入样例: 在这里给出一组输入。例如: 4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3 输出样例: 在这里给出相应的输出。例如: 7
时间: 2024-03-26 11:39:03 浏览: 46
```
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 5005, M = 100005;
struct Edge {
int a, b, w;
bool operator < (const Edge& t) const {
return w < t.w;
}
};
int n, m;
Edge edges[M];
int p[N];
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b, w;
cin >> a >> b >> w;
edges[i] = {a, b, w};
}
sort(edges, edges + m);
for (int i = 1; i <= n; i++) p[i] = i;
int cnt = 0;
int res = 0;
for (int i = 0; i < m; i++) {
int a = edges[i].a, b = edges[i].b, w = edges[i].w;
int pa = find(a), pb = find(b);
if (pa != pb) {
p[pa] = pb;
res += w;
cnt++;
}
}
if (cnt < n - 1) cout << "No" << endl;
else cout << res << endl;
return 0;
}
```
阅读全文