Floyd算法

Floyd算法

算法概述

Floyd算法,也称为Floyd-Warshall算法,是一种用于解决图中所有节点对之间最短路径的动态规划算法。该算法的目标是找到图中每一对节点之间的最短路径,考虑图中的权重(边上的权值)。

算法的核心思想是通过一个中间节点的集合,逐步优化节点对之间的最短路径。具体来说,Floyd算法使用一个二维数组来存储任意两个节点之间的最短路径长度,然后通过逐步考虑图中所有节点作为中间节点的情况,不断更新最短路径的信息。

算法的步骤如下:

  1. 初始化一个二维数组,其中元素(i, j)表示节点i到节点j的最短路径长度。如果节点i和节点j之间没有直接连接的边,则初始化为无穷大;如果有直接连接的边,则初始化为边的权值。
  2. 对于每一个可能的中间节点k,遍历所有节点对(i, j),如果路径(i, k, j)的长度小于当前已知的路径(i, j)的长度,则更新路径(i, j)的长度为(i, k, j)的长度。
  3. 重复步骤2,直到考虑了所有可能的中间节点。

最终,二维数组中的元素(i, j)将包含节点i到节点j的最短路径长度。

Floyd算法的时间复杂度为O(V^3),其中V是图中节点的数量。这使得Floyd算法在节点数较小的情况下是有效的,但在节点数较大时可能会变得相对较慢。

c++演示

#include 
#include 

// 定义图的最大节点数
#define MAX_NODES 100

// 使用无穷大表示两节点之间没有直接连接的边
#define INF INT_MAX

void floydWarshall(int graph[MAX_NODES][MAX_NODES], int numNodes) {
    // 初始化路径数组,表示任意两节点之间的最短路径长度
    int dist[MAX_NODES][MAX_NODES];

    // 将图中的路径长度复制到dist数组中
    for (int i = 0; i < numNodes; ++i) {
        for (int j = 0; j < numNodes; ++j) {
            dist[i][j] = graph[i][j];
        }
    }

    // 逐步考虑每个节点作为中间节点
    for (int k = 0; k < numNodes; ++k) {
        // 遍历所有节点对(i, j),尝试通过中间节点k优化路径
        for (int i = 0; i < numNodes; ++i) {
            for (int j = 0; j < numNodes; ++j) {
                // 如果路径(i, k, j)的长度小于当前已知的路径(i, j)的长度,则更新路径
                if (dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                }
            }
        }
    }

    // 打印最终的最短路径矩阵
    std::cout << "最短路径矩阵:" << std::endl;
    for (int i = 0; i < numNodes; ++i) {
        for (int j = 0; j < numNodes; ++j) {
            if (dist[i][j] == INF) {
                std::cout << "INF\t";
            } else {
                std::cout << dist[i][j] << "\t";
            }
        }
        std::cout << std::endl;
    }
}

int main() {
    // 图的邻接矩阵表示
    int graph[MAX_NODES][MAX_NODES] = {
        {0, 5, INF, 10},
        {INF, 0, 3, INF},
        {INF, INF, 0, 1},
        {INF, INF, INF, 0}
    };

    // 节点数量
    int numNodes = 4;

    // 调用Floyd算法
    floydWarshall(graph, numNodes);

    return 0;
}

这里要注意的是两点之间的权值, 可能要按照具体要求写出具体的表达式.

此外最后有些题目是要求出其他的东西, 不是要求打印数组, 也要按照要求进行相应的改写.

参考题目 leetcode1334 网址:https://leetcode.cn/problems/find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance/description/?envType=daily-question&envId=2023-11-14

你可能感兴趣的:(算法,开发语言)