C++ 最短路径

目录:

最短路径简介

Floyd算法 \ Floyd-warshall算法

Dijkstra算法

Bellman-Ford算法 \ SPFA算法

Johnson算法

A*算法


最短路径简介:

        最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括:

        (1)确定起点的最短路径问题( 即已知起始结点),求最短路径的问题。

        (2)确定终点的最短路径问题(与确定起点的问题相反),该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。

        (3)确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。

        (4)全局最短路径问题 - 求图中所有的最短路径。

        解决最短路径问题有 5 种主流的算法:Floyd算法 \ Floyd-warshall算法,Dijkstra算法,Bellman-Ford算法 \ SPFA算法,Johnson算法,A*算法。

Floyd算法 \ Floyd-warshall算法:

        Floyd算法 和 Floyd-warshall算法 实际上是一个东西,只不过是名字不同罢了。

        Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授 罗伯特·弗洛伊德 命名。

        Floyd算法的边权值可正可负,但需要使用邻接矩阵存储图的边权值。

        时间复杂度:O(n^{3})

【代码实现】

//假设有n个点,
  • 6
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
迪杰斯特拉算法(Dijkstra's algorithm)是一种用于解决图中单源最短路径问题的经典算法。它可以找到从起点到图中所有其他节点的最短路径。 以下是一个使用C语言实现的迪杰斯特拉算法的示例代码: ```c #include <stdio.h> #include <limits.h> #define V 9 int minDistance(int dist[], bool sptSet[]) { int min = INT_MAX, min_index; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) min = dist[v], min_index = v; return min_index; } void printSolution(int dist[]) { printf("Vertex \t Distance from Source\n"); for (int i = 0; i < V; i++) printf("%d \t\t %d\n", i, dist[i]); } void dijkstra(int graph[V][V], int src) { int dist[V]; bool sptSet[V]; for (int i = 0; i < V; i++) dist[i] = INT_MAX, sptSet[i] = false; dist[src] = 0; for (int count = 0; count < V - 1; count++) { int u = minDistance(dist, sptSet); sptSet[u] = true; for (int v = 0; v < V; v++) if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) dist[v] = dist[u] + graph[u][v]; } printSolution(dist); } int main() { int graph[V][V] = {{0, 4, 0, 0, 0, 0, 0, 8, 0}, {4, 0, 8, 0, 0, 0, 0, 11, 0}, {0, 8, 0, 7, 0, 4, 0, 0, 2}, {0, 0, 7, 0, 9, 14, 0, 0, 0}, {0, 0, 0, 9, 0, 10, 0, 0, 0}, {0, 0, 4, 14, 10, 0, 2, 0, 0}, {0, 0, 0, 0, 0, 2, 0, 1, 6}, {8, 11, 0, 0, 0, 0, 1, 0, 7}, {0, 0, 2, 0, 0, 0, 6, 7, 0}}; dijkstra(graph, 0); return 0; } ``` 这个示例代码中的图是一个包含9个节点的无向图,通过调用`dijkstra`函数,将从节点0开始到其他节点的最短路径打印出来。你可以根据自己的需求修改图的大小和边的权重来运行该代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值