用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
```
代码如下:
```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
```