C语言实现最小生成树构造算法

C语言实现最小生成树构造算法攻略

最小生成树(Minimum Spanning Tree,MST)是一种求加权无向连通图的生成树的算法,其可以将连通图的n个顶点连接起来,形成一个权值最小的树。本文将介绍使用C语言实现最小生成树构造算法的攻略。

算法简介

其中,Kruskal算法和Prim算法是最常用的两个求解最小生成树的算法。

  • Kruskal算法

Kruskal算法首先需要把图中所有的边从小到大排序,依次取出每一条边,检查该边的两个顶点是否在同一个连通分量内,若不在,则将这条边放入生成树中,并将这两个顶点之间连通。

  • Prim算法

Prim算法则需要选取一个任意的顶点作为根节点,每次向生成树中添加一条从树中已有节点到不在树上的节点的最短边,直到所有节点都在生成树中。

Kruskal算法实现

下面是使用C语言实现Kruskal算法的示例代码:

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

#define MAX 1000

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

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

int Kruskal(Edge *edges, int n, int m, Edge *tree)
{
    int i, j, k;
    int set[MAX];

    for (i = 0; i < n; ++i)
        set[i] = i;

    qsort(edges, m, sizeof(edges[0]), cmp);  // 对边按权值进行排序

    for (i = j = 0; i < m && j < n - 1; ++i) {
        int u = edges[i].u, v = edges[i].v, w = edges[i].w;
        while (u != set[u]) u = set[u];
        while (v != set[v]) v = set[v];
        if (u != v) {
            set[u] = v;
            tree[j++] = edges[i];
        }
    }

    return (j == n - 1);  // 如果生成树边数为n-1则返回1,否则返回0
}

int main()
{
    int n, m;
    Edge edges[MAX], tree[MAX];
    scanf("%d %d", &n, &m);

    for (int i = 0; i < m; ++i)
        scanf("%d %d %d", &edges[i].u, &edges[i].v, &edges[i].w);

    if (!Kruskal(edges, n, m, tree)) {
        printf("No MST!\n");  // 如果生成树不存在则输出No MST!
    }
    else {
        int w = 0;
        for (int i = 0; i < n - 1; ++i)
            w += tree[i].w;
        printf("MST weight=%d\n", w);
        for (int i = 0; i < n - 1; ++i)
            printf("(%d,%d) ", tree[i].u, tree[i].v);
    }

    return 0;
}

Prim算法实现

下面是使用C语言实现Prim算法的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdbool.h>

#define MAX 1000

int adj[MAX][MAX];

int Prim(int n, int **edges)
{
    int i, j, k;
    int dist[MAX], parent[MAX];
    bool visited[MAX];

    for (i = 0; i < n; ++i) {
        dist[i] = INT_MAX;
        visited[i] = false;
    }
    dist[0] = 0;
    parent[0] = -1;

    for (i = 0; i < n - 1; ++i) {
        int u = -1;
        for (j = 0; j < n; ++j) {
            if (!visited[j] && (u == -1 || dist[u] > dist[j]))
                u = j;
        }
        visited[u] = true;
        for (v = 0; v < n; ++v) {
            if (adj[u][v] && !visited[v] && dist[v] > adj[u][v]) {
                dist[v] = adj[u][v];
                parent[v] = u;
            }
        }
    }

    for (i = 1, k = 0; i < n; ++i) {
        if (parent[i] != -1) {
            edges[k][0] = parent[i];
            edges[k++][1] = i;
        }
    }

    return k;
}

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);

    for (int i = 0; i < m; ++i) {
        int u, v, w;
        scanf("%d %d %d", &u, &v, &w);
        adj[u][v] = w;
        adj[v][u] = w;
    }

    int **tree = (int**)malloc((n - 1) * sizeof(int*));
    for (int i = 0; i < n - 1; ++i) {
        tree[i] = (int*)malloc(2 * sizeof(int));
    }

    int k = Prim(n, tree);  // k为生成树的边数

    int w = 0;
    for (int i = 0; i < k; ++i)
        w += adj[tree[i][0]][tree[i][1]];
    printf("MST weight=%d\n", w);
    for (int i = 0; i < k; ++i)
        printf("(%d,%d) ", tree[i][0], tree[i][1]);

    return 0;
}

结束语

以上就是C语言实现最小生成树构造算法的详细攻略,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现最小生成树构造算法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C#中Json反序列化的实现方法

    C#中我们可以使用Json反序列化来将Json字符串转换成对应的对象。下面介绍C#中Json反序列化的实现方法: 准备工作 在进行Json反序列化前,我们需要引入Newtonsoft.Json库。使用NuGet包管理器进行安装,或者手动下载该库进行引入。 Install-Package Newtonsoft.Json -Version 13.0.1 反序列化…

    C 2023年5月23日
    00
  • 海康存储C4000ECO 1T怎么样? 海康存储C4000ECO 1T固态硬盘测评

    海康存储C4000ECO 1T固态硬盘测评 概述 海康存储C4000ECO 1T是一款固态硬盘,采用SATA III接口,配备1TB的存储容量。本文对该固态硬盘进行了细致的评测和测试,下面详细介绍该固态硬盘的性能表现。 性能测试 读写速度测试 我们使用CrystalDiskMark软件进行了读写速度测试,测试结果如下: ——————-…

    C 2023年5月23日
    00
  • C语言中如何进行多语言支持?

    在C语言中进行多语言支持,其主要的实现方式是通过字符串本地化来实现的。具体步骤如下: 1. 设计国际化字符串 首先,我们需要将所有需要支持的语言的字符串收集到一个字符串池中,并将它们按照关键字进行分类,这个过程被称为字符串本地化(Localization)。例如: // 中文 char *zh[] = { "你好", "世界&q…

    C 2023年4月27日
    00
  • Json解析的方法小结

    以下是“Json解析的方法小结”的完整攻略: 什么是Json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。在数据交换时,Json更加方便快捷。 Json解析的方法 Json解析的方法有4种,分别是: 1. 基于JSON…

    C 2023年5月23日
    00
  • 用C语言实现圣诞树(简易版+进阶版)

    用C语言实现圣诞树(简易版) 1. 简介 该项目是使用C语言编写的简易版圣诞树,主要运用了printf函数的格式控制符,实现了树干和树叶的绘制,以及使用循环控制结构来控制树叶的数量。 2. 实现过程 2.1 绘制树干 树干的绘制使用printf函数实现,主要通过使用空格和竖线符(“|”)来实现。具体实现代码如下: printf(" |\n&quot…

    C 2023年5月23日
    00
  • ASP.NET使用Ajax返回Json对象的方法

    ASP.NET是Microsoft公司的一个Web应用程序平台,而AJAX是一种在不刷新页面的情况下,实现Web应用程序异步通信的技术,使用Ajax返回Json对象可以实现异步的数据传递。下面是ASP.NET使用Ajax返回Json对象的方法的详细攻略。 准备工作 在使用Ajax返回Json对象之前,需要引入以下JavaScript文件: <scrip…

    C 2023年5月23日
    00
  • C语言实战之浪漫烟花表白程序代码

    以下是针对“C语言实战之浪漫烟花表白程序代码”的完整攻略,包含了代码的实现细节和使用说明。 程序功能简介 本程序是一款基于C语言实现的烟花表白程序,可以在Windows系统中运行。在开启程序后,将会出现浪漫的烟花飞舞效果,并在屏幕中央显示一段特定的表白文字,可以为你的恋人带来浪漫的惊喜。 程序实现原理 程序基于图形库PDCurses实现,采用C语言编写。具体…

    C 2023年5月23日
    00
  • C++实现调用系统时间简单示例

    下面我将为你详细讲解“C++实现调用系统时间简单示例”的完整攻略。 1. 环境要求 在开始示例代码的实现之前,我们需要确保本地环境已包含C++编译器。可以选择在本地安装VS Code或者其他的编译器软件。以下是某些流行的编译器: Visual Studio CodeBlocks Dev-C++ 在这个示例过程中,我们将使用VS Code作为开发环境。 2. …

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部