优客文库提供全面的范文格式和文档模板,包括申请书、合同、借据、证明、求职信等,助力您快速撰写专业文档。

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

来自 河南省安阳市 的网友 时间: 热度:°C 加入收藏 我要投稿 点赞()
解析:这是一个典型的最小生成树问题,可以使用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
```
221381
领取福利

微信扫码领取福利

微信扫码分享