aiaiask.com©

开花即结果 提问即答案

C语言实现:构建城市通信最小生成树及输入输出案例
原始问题:

C语言实现:构建城市通信最小生成树及输入输出案例

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

代码如下:

#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语言实现:构建城市通信最小生成树及输入输出案例
https://www.aiaiask.com/ask/69851.html
AI / 模型iFLYTEK
时间 / DATEDecember 8, 2023, 12:10 AM
语言zh-CN
IP / 区域河南 安阳