C语言实现Floyd算法

C语言实现Floyd算法

什么是Floyd算法

Floyd算法是一种用于寻找给定的加权图中多源点之间最短路径的算法,也称为Floyd-Warshall算法。 其时间复杂度为O(N^3),适用于需要求解所有顶点对间最短路径的场景。

算法思路

Floyd算法的思路是利用动态规划的思想,通过逐步考虑添加中间顶点的方式来逐步求得顶点对间的最短路径。 也就是说,我们首先考虑只通过V1来寻找其他顶点的最短路径,然后考虑只通过V1和V2来寻找其他顶点的最短路径,以此类推,最终得到所有顶点对之间的最短路径。

下面是Floyd算法的核心代码:

void Floyd(int n, double (*a)[MAXV], double (*d)[MAXV], int (*path)[MAXV])
{
    int i, j, k;
    memcpy(d, a, sizeof(double) * MAXV * MAXV);
    for (k = 0; k < n; k++) {
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                if (d[i][j] > d[i][k] + d[k][j]) {
                    d[i][j] = d[i][k] + d[k][j];
                    path[i][j] = k;
                }
            }
        }
    }
}

其中,n表示顶点数,a表示邻接矩阵,d表示最短路径矩阵,path表示路径记录矩阵。

示例说明

以以下的图为例,其中5表示无穷大,表示两个点没有边相连:

0  1  2  3  4
---------------
0| 0  4  5  5  5
1| 4  0  3  5  5
2| 5  3  0  1  5
3| 5  5  1  0  2
4| 5  5  5  2  0

我们可以通过以下代码来求解该图的最短路径:

#include <stdio.h>
#include <string.h>
#define MAXV 1000
#define INF 1e9

int main()
{
    int n = 5; 
    double a[MAXV][MAXV] = {
        {0, 4, 5, 5, 5},
        {4, 0, 3, 5, 5},
        {5, 3, 0, 1, 5},
        {5, 5, 1, 0, 2},
        {5, 5, 5, 2, 0},
    };
    double d[MAXV][MAXV];
    int path[MAXV][MAXV];
    memset(path, -1, sizeof(path));
    Floyd(n, a, d, path);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%.2lf ", d[i][j]);
        }
        printf("\n");
    }
    return 0;
}

输出的结果为:

0.00 4.00 5.00 5.00 5.00 
4.00 0.00 3.00 5.00 5.00 
5.00 3.00 0.00 1.00 5.00 
5.00 5.00 1.00 0.00 2.00 
5.00 5.00 5.00 2.00 0.00 

其中,d[i][j]表示从i到j的最短路径长度。

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

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

相关文章

  • 手把手教你如何一眼分辨是C还是C++

    手把手教你如何一眼分辨是C还是C++ 介绍 C和C++作为编程语言很相似,因此对于初学者来说有时很难分辨是C还是C++。本文将从语法、命名惯例和拓展名等方面进行详细讲解,帮助初学者一眼分辨是C还是C++。 语法 在语法方面,C与C++的区别不是很大,但有几个明显的区别,我们可以通过这些区别来分辨出它们所属的语言。 1. 头文件 C使用.h作为头文件拓展名,而…

    C 2023年5月23日
    00
  • 禁止winXP按F8键进入安全模式限制受限用户修改注册表

    禁止winXP按F8键进入安全模式限制受限用户修改注册表的完整攻略,可以分为以下几个步骤: 打开组策略编辑器。在开始菜单中点击“运行”,输入“gpedit.msc”,并回车。如下所示: 按下Win+R键,然后输入gpedit.msc并回车即可打开组策略编辑器。 找到“禁用系统恢复”,并启用该选项。在组策略编辑器中,展开“计算机配置”→“管理模板”→“系统”→…

    C 2023年5月30日
    00
  • 如何通过wrap malloc定位C/C++的内存泄漏问题

    如果要通过 wrap malloc 定位 C/C++ 的内存泄漏问题,我会按照以下步骤进行: 1. 使用 wrap malloc wrap malloc 是一个 Linux 平台提供的工具,它可以拦截程序中的内存分配函数,比如 malloc 和 realloc,来实现内存泄漏的定位。首先需要安装 libwrap0-dev: sudo apt-get upda…

    C 2023年5月23日
    00
  • 将List对象列表转换成JSON格式的类实现方法

    将List对象列表转换成JSON格式,一般使用JSON工具库实现,如Jackson和Gson。下面将分别介绍Jackson和Gson两个库的实现方法。 Jackson 步骤一:导入Jackson库 在pom.xml文件中添加以下依赖: <dependencies> <dependency> <groupId>com.fas…

    C 2023年5月23日
    00
  • C语言可变参数列表的用法与深度剖析

    C语言可变参数列表的用法与深度剖析 C语言中的可变参数列表是一种强大的功能,它允许我们定义一个参数数量不定的函数。一般情况下,我们使用可变参数列表来编写那些需要处理不定数量参数的函数,例如printf函数和scanf函数。在本篇文章中,我们将对C语言可变参数列表的用法进行详细讲解,并给出两个示例说明。 什么是可变参数列表? 可变参数列表是指函数的参数数量是不…

    C 2023年5月23日
    00
  • 在Linux系统中使用GDB来调试C/C++程序的方法

    在Linux系统中使用GDB来调试C/C++程序的方法可以分为以下几个步骤: 1. 编译C/C++程序时添加编译选项 为了让程序在调试时保留符号表信息,需要在编译C/C++源代码时添加编译选项 -g。例如: $ gcc -g -o myprog myprog.c 这样编译出来的可执行文件中就包含了符号表信息,可以用于调试。 2. 启动GDB调试器 在终端中输…

    C 2023年5月24日
    00
  • C语言通讯录管理系统完整代码

    C语言通讯录管理系统完整代码攻略 概述 本文将介绍C语言实现的通讯录管理系统的完整代码,并且对代码进行详细讲解说明。该代码实现的功能包括通讯录的增加、删除、修改、查询和展示等。 代码说明 代码结构 该代码主要分为两个文件,一个是 main.c,另一个是 contacts.h。其中 main.c 中包含了程序的入口 main 函数以及 contacts.h 的…

    C 2023年5月23日
    00
  • c++11中的noexcept关键字

    当在C++代码中使用noexcept关键字时,可以告诉编译器函数不会抛出任何异常。当使用noexcept关键字时,可以提高代码的性能和可靠性,因为在一些情况下,编译器可以使用更快、更简单的代码生成策略。 使用方法 noexcept可以用在函数声明和定义处。在声明时,使用noexcept关键字声明函数不会抛出任何异常。在定义时(函数体内),如果函数抛出异常,则…

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