首页 > 编程语言 >数据结构学习笔记-佛洛依德算法

数据结构学习笔记-佛洛依德算法

时间:2024-06-07 20:23:20浏览次数:24  
标签:dist ++ 矩阵 int 算法 顶点 佛洛依德 数据结构 INF

最短路径问题的经典解法-佛洛依德算法

问题描述:设计算法求解图的最短路径

【算法设计思想】

  1. 初始化距离矩阵:首先,将解决方案矩阵 dist[][] 初始化为输入图矩阵 graph[][],这个矩阵存储了顶点之间的直接距离或者权值。
  2. 中间顶点迭代:然后,对每一个顶点作为中间顶点进行迭代。算法通过逐步考虑中间顶点,尝试找到更短的路径。
  3. 源点和目标点迭代:对于每一对源点和目标点,算法尝试通过当前的中间顶点来缩短路径。
  4. 更新最短路径:如果顶点 k 在顶点 i 和 j 之间的最短路径上,那么更新 dist[i][j],使其成为新的最短路径。
  5. 迭代完成:当所有的中间顶点都被考虑完毕时,算法结束,此时 dist[][] 中存储的就是所有顶点对之间的最短路径。
  6. 打印最短路径矩阵:最后,打印出计算得到的最短路径矩阵,即图中所有顶点对之间的最短路径长度。

【算法描述】

// 实现Floyd Warshall算法
void floydWarshall(int graph[][V]) {
    // dist[][]将是输出数组,即最终的最短距离矩阵
    int dist[V][V], i, j, k;

    // 初始化解决方案矩阵,与输入图矩阵一样
    for (i = 0; i < V; i++)
        for (j = 0; j < V; j++)
            dist[i][j] = graph[i][j];

    // 添加所有顶点一个个作为中间顶点
    for (k = 0; k < V; k++) {
        // 选择所有顶点作为源点
        for (i = 0; i < V; i++) {
            // 选择所有顶点作为目标点,对于每个源点和目标点对
            for (j = 0; j < V; j++) {
                // 如果顶点k在i和j之间的最短路径上,则更新dist[i][j]
                if (dist[i][k] + dist[k][j] < dist[i][j])
                    dist[i][j] = dist[i][k] + dist[k][j];
            }
        }
    }

    // 打印最短距离矩阵
    printSolution(dist);
}

【完整的测试程序】

#include <stdio.h>

// 定义无穷大,表示两点间无直接连接
#define INF 99999

// 顶点数
#define V 4

// 打印解决方案的函数
void printSolution(int dist[][V]);

// 实现Floyd Warshall算法
void floydWarshall(int graph[][V]) {
    // dist[][]将是输出数组,即最终的最短距离矩阵
    int dist[V][V], i, j, k;

    // 初始化解决方案矩阵,与输入图矩阵一样
    for (i = 0; i < V; i++)
        for (j = 0; j < V; j++)
            dist[i][j] = graph[i][j];

    // 添加所有顶点一个个作为中间顶点
    for (k = 0; k < V; k++) {
        // 选择所有顶点作为源点
        for (i = 0; i < V; i++) {
            // 选择所有顶点作为目标点,对于每个源点和目标点对
            for (j = 0; j < V; j++) {
                // 如果顶点k在i和j之间的最短路径上,则更新dist[i][j]
                if (dist[i][k] + dist[k][j] < dist[i][j])
                    dist[i][j] = dist[i][k] + dist[k][j];
            }
        }
    }

    // 打印最短距离矩阵
    printSolution(dist);
}

void printSolution(int dist[][V]) {
    printf("以下矩阵显示所有点对之间的最短距离\n");
    for (int i = 0; i < V; i++) {
        for (int j = 0; j < V; j++) {
            if (dist[i][j] == INF)
                printf("%7s", "INF");
            else
                printf("%7d", dist[i][j]);
        }
        printf("\n");
    }
}

int main() {
    /* 例子中的图的权重矩阵 */
    int graph[V][V] = {{0, 5, INF, 10},
                       {INF, 0, 3, INF},
                       {INF, INF, 0, 1},
                       {INF, INF, INF, 0}
                      };

    // 运行Floyd-Warshall算法
    floydWarshall(graph);
    return 0;
}

标签:dist,++,矩阵,int,算法,顶点,佛洛依德,数据结构,INF
From: https://www.cnblogs.com/zeta186012/p/18237805

相关文章

  • 算法题-无重复字符的最长子串
    学习目标:无重复字符的最长子串leetcode原题链接学习内容:给定一个字符串s,请你找出其中不含有重复字符的最长连续子字符串的长度。示例1:输入:s=“abcabcbb”输出:3解释:因为无重复字符的最长子字符串是“abc”,所以其长度为3。示例2:输入:s=“......
  • 代码随想录算法训练营第30天|回溯复习篇
    回溯基础理论1.回溯的本质是利用递归进行暴力搜索,将符和条件的结果集搜索出来2.回溯法常见的问题:组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合......
  • 机器学习--有监督学习--算法整理
     整理原因:为了更好的理解学习算法为什么有用,还是决定认真看看推导公式和过程。以下是有监督学习线性回归的推导过程。算法目标:根据一组x和y的对应关系,找到他们的线性关系,得到拟合线性方程:y=ax+b,从而对于任意的自变量x,都可以预测到对应的因变量y的值。并且,要保证这个a,b足够可靠......
  • 机器学习-聚类算法
    1.有监督学习与无监督学习有监督:在训练集中给的数据中有X和Y,根据这些数据训练出一组参数对预测集进行预测无监督:在训练集中给的数据只有X没有Y,根据X数据找相似度参数来对预测集进行预测2.数据间的相似度2.1距离相似度:每一条数据可以理解为一个n维空间中的点,可以根据点点之......
  • 代码随想录算法训练营第三十天 | 51.N 皇后
    51.N皇后题目链接文章讲解视频讲解递归三部曲递归函数参数需要传入当前chessBoard和棋盘大小n,以及当前要放置皇后的行数rowvoidbacktracking(vector<string>&chessBoard,intn,introw);递归终止条件当最后一个皇后放置好后结束if(row==n){result.push_b......
  • C++数据结构之:哈希表Hash
    摘要:  it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储......
  • C++数据结构之:图Graph
    摘要:  it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结......
  • 安防监控平台智能边缘分析一体机视频监控系统室内消防通道占用检测算法
    随着城市化进程的加速,高层建筑如雨后春笋般涌现。这些建筑的消防安全问题日益凸显,尤其是消防通道的占用问题。为了解决这一问题,智能边缘分析一体机被引入到室内消防通道占用检测中,以提高检测效率和准确性。本文将探讨这一技术的应用及其重要性。智能边缘分析一体机是一种集成......
  • 开山之作!Python数据与算法分析手册,登顶GitHub!
    若把编写代码比作行军打仗,那么要想称霸沙场,不能仅靠手中的利刃,还需深谙兵法。Python是一把利刃,数据结构与算法则是兵法。只有熟读兵法,才能使利刃所向披靡。只有洞彻数据结构与算法,才能真正精通Python。今天给小伙伴们分享的这份手册,是用Python描述数据结构与算法的开山之作,......
  • 程序分享--常见算法/编程面试题:罗马数字转整数
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容,持续上传中。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满......