首页 > AI文库 >

用C语言完成:用连通网中的顶点表示城市,边上的权值表示在这两个城市建立通信所花费的代价。求要连通所有的城市所花费的最小代价,要求构造最小生成树,并完成输入输出的案例

分享 18395
解析:这是一个典型的最小生成树问题,可以使用Kruskal算法或Prim算法来解决。这里我们使用Kruskal算法来实现。首先需要定义一个边的结构体,包含两个顶点和权值。然后创建一个并查集来维护连通性。接着从最小的边开始遍历,如果加入这条边不会破坏连通性,就将其加入最小生成树。最后输出最小生成树的总权值。

代码如下:

```c
#include <stdio.h>
#include <stdlib.h>

typedef struct Edge {
int u, v, w;
} Edge;

int cmp(const void *a, const void *b) {
return ((Edge *)a)->w - ((Edge *)b)->w;
}

int find(int x, int *parent) {
if (parent[x] == x) {
return x;
}
return parent[x] = find(parent[x], parent);
}

void union_set(int x, int y, int *parent) {
int root_x = find(x, parent);
int root_y = find(y, parent);
if (root_x != root_y) {
parent[root_y] = root_x;
}
}

int main() {
int n, m;
scanf("%d %d", &n, &m);
Edge edges[m];
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &edges[i].u, &edges[i].v, &edges[i].w);
}
qsort(edges, m, sizeof(Edge), cmp);

int parent[n + 1];
for (int i = 1; i <= n; i++) {
parent[i] = i;
}

int ans = 0;
for (int i = 0; i < m; i++) {
int u = edges[i].u;
int v = edges[i].v;
int w = edges[i].w;
if (find(u, parent) != find(v, parent)) {
ans += w;
union_set(u, v, parent);
}
}

printf("%d
", ans);
return 0;
}
```

输入输出案例:

```
输入:
5 7
1 2 3
1 3 4
2 4 5
2 5 6
3 5 7
输出:
11
```

相关推荐

中国经济实现高质量发展具备哪些显著优势论文1500字

AI文库

世界变乱交织,中国笃行担当 变革动荡 大国关系 中国智慧 上述内容分别为大标题和三个小标题,请以此写出不少于2000字的形式与政策论文,要求内容充实具体,不存在抄袭、、雷同情况

AI文库

假如你是形式与政策这个课程的一名学生,请以“世界变乱多织,中国笃行担当”为主题,写一篇论文,要求完全按照论文的格式,字数一定在2500字以上!

AI文库

请结合《走好新时代科技自立自强之路》专题和今年2月8日广东省高质量发展大会聚焦产业科技话创新、谋未来主题,谈谈你对党的二十大提出的“科技强国”战略的认识及行动

AI文库

国家安全为什么与你我息息相关论文不少于1500

AI文库

热门图文

上一篇:对公共事务管理专业信息有那些启发

下一篇:中国经济实现高质量发展具备哪些显著优势论文1500字