`
huayu0815
  • 浏览: 57941 次
  • 性别: Icon_minigender_1
  • 来自: 河南
文章分类
社区版块
存档分类
最新评论

最短路径(Floyd算法和Dijkstra算法和Bellman-Ford算法)

 
阅读更多

完全最短路径(Floyd算法):[复杂度:O(n^3)]

// 矩阵mat初始值INT_MAX  

// 结果 mat[i][j] 为点i到j的最短路径  

// mat[i][j] == INT_MAX时候为不可到达  

   

void Floyd(int n)  

{   

    int i, j, k;  

    for (k = 1; k <= n; k++)  

        for (i = 1; i <= n; i++)  

            for (j = 1; j <= n; j++)  

                if (mat[i][k] != INT_MAX &&  

                    mat[k][j] != INT_MAX &&  

                    mat[i][k]+mat[k][j] < mat[i][j])  

                        mat[i][j] = mat[i][k] + mat[k][j];  

} 


单源最短路径Dijkstra算法:

// mat初始值为INT_MAX,即不可到达  

// s表示起始点,p重点,n节点个数,返回s到p的最短路径  

// 当返回结果为INT_MAX时,表示不可达  

// 结果dis为第s点到其他点的最短路径  

   

int dis[MAXN];  

bool flag[MAXN];  

int mat[MAXN][MAXN];  

   

void Dijkstra(int s, int p, int n)  

{  

    int i, j;  

    for (i = 1; i <= n; i++)  

        dis[i] = mat[s][i], flag[i] = false;  

    flag[s] = true, dis[s] = 0;  

   

    for (i = 1; i <= n; i++)  

    {  

        int k = s, t = INT_MAX;  

        for (j = 1; j <= n; j++)  

            if (!flag[j] && dis[j] < t)  

                k = j, t = dis[j];  

        flag[k] = true;  

        for (j = 1; j <= n; j++)  

            if (!flag[j] && mat[k][j] != INT_MAX  

                && dis[k] + mat[k][j] < dis[j])  

                    dis[j] = dis[k] + mat[k][j];  

    }  

} 


Bellman-Ford算法:

适用范围:

  1. 单源最短路径(从源点s到其它所有顶点v);
  2. 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图);
  3. 边权可正可负(如有负权回路输出错误提示);
  4. 差分约束系统;

算法描述:

  1. 对每条边进行|V|-1次Relax操作;
  2. 如果存在(u,v)∈E使得dis[u]+w<dis[v],则存在负权回路;否则dis[v]即为s到v的最短距离,pre[v]为前驱。

For i:=1 to |V|-1 do //v为顶点数
For 每条边(u,v)∈E do //对每条边进行遍历
Relax(u,v,w);
For 每条边(u,v)∈E do
If dis[u]+w<dis[v] Then Exit(False)

分享到:
评论

相关推荐

    最短路径的改进算法与实现

    最短路径问题是图论中研究的一个重要课题,它广泛应用于交通、网络寻优等领域。此类问题不仅仅指一般地理意义上...本文对最短路径算法最常见的三种算法Dijkstra算法、Floyd算法、Bellman-Ford算法分别进行了改进与实现。

    算法设计中最短路径问题

    包含最短路径算法的原理讲解,并针对具体事例应用C语言进行实现

    C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序

    与Bellman-Ford算法或Dijkstra算法一样,它计算图中的最短路径。然而,Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面,Floyd Warshall计算输入图中每对顶点之间的...

    山东大学2018算法导论图论考试复习总结

    3.4 差分约束和最短路径 3.5 最短路径的性质证明(三上无路收钱) 4 所有结点对的最短路径问题 4.1 矩阵乘法 matrix multiplication improved matrix mult. 4.2 Floyd-Warshall算法 4.3 用于稀疏图的Johnson算法 5 ...

    什么是dijkstra算法

    不同于其他最短路径算法(如Bellman-Ford算法或Floyd-Warshall算法),Dijkstra算法要求图中不存在负权边,否则可能导致计算结果不准确。 Dijkstra算法的基本思想是通过贪心策略逐步确定从源节点到其它各节点的最短...

    常用算法(python)

    冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 希尔排序(Shell Sort) ...Bellman-Ford 算法 Floyd-Warshall 算法 Kruskal 算法 Prim 算法 Edmonds-Karp 算法 Ford-Fulkerson 算法

    最短路课件 求单源最短路径

    讲了常用的求单源最短路径的算法,非常好的资料。。

    图论知识点+算法实现课件

    2. Bellman-Ford算法:允许边权为负数,通过松弛操作逐步更新每个点到起点的最短距离,可以检测负权环。 3. Floyd-Warshall算法:通过动态规划的方式计算每两个点之间的最短路径长度,适用于小规模图的情况。 4. A...

    ACM 常用代码 数学问题 计算几何 数论 图论 数据结构

    精度计算——大数阶乘 组合序列 最大公约数、...任意进制转换 叉乘法求任意多边形面积 两矢量间角度 Prim算法求最小生成树 Dijkstra算法求单源最短路径 Bellman-ford算法求单源最短路径 Floyd算法求每对节点间最短路径

    leetcode刷题app-blog:问题博客

    Bellman-Ford 1.5 全源最短路径 - Floyd Warshall 1.6 全源最短路径 - Johnson 1.6 最小生成树 - Prim 1.7 最小生成树 - Kruskal 1.8 拓扑排序 2. 动态规划 2.1 最长公共子序列 - LCS(Longest Common Subsequence) ...

    全面的算法代码库

    单源最短路径(Bellman-Ford) Bellman-Ford 使用Edmonds-Karp进行二分图匹配 Bigrpah-Matching(Edmonds-Karp) 普通的二叉搜索树 Binary-Search-Tree 广度优先搜索 Breadth-First-Search 冒泡排序 Bubble-Sort ...

    北大oj 题目分类

    (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序 (poj...

    ITMO-Algorithms-2-sem

    数据结构与算法II 实验室在ITMO大学从事数据结构和算法研究。 实验工作是用C ++语言完成的。 主要主题是图形和在字符串上查找... (Bellman-Ford算法) 5.图形流 (Edmonds-Karp算法) (匈牙利算法) 6.子串搜索

    ACM 算法经典代码 数据结构经典代码

    3.Bellman-ford算法求单源最短路径 4.Floyd算法求每对节点间最短路径 排序/查找: 1.快速排序 2.希尔排序 3.选择法排序 4.二分查找 数据结构: 1.顺序队列 2.顺序栈 3.链表 4.链栈 5.二叉树

    浙大算法包,几何 结构\数论\数值计算\图论_NP搜索\图论_连通性\图论_匹配\组合\

    最短路径(单源bellman_ford邻接阵形式) 最短路径(单源dijkstra邻接阵形式) 最短路径(单源dijkstra_bfs邻接表形式) 最短路径(单源dijkstra_bfs正向表形式) 最短路径(单源dijkstra+binary_heap邻接表形式) 最短...

    ACM算法模版大集合

    非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler ...

    acm常用代码及算法

    3.Bellman-ford算法求单源最短路径 4.Floyd算法求每对节点间最短路径 排序/查找: 1.快速排序 2.希尔排序 3.选择法排序 4.二分查找 数据结构: 1.顺序队列 2.顺序栈 ...

    MatlabBGL:MatlabBGL 使用原生数据结构为 Matlab 提供了强大而高效的图形算法。-matlab开发

    最短路径算法:Dijkstra 算法、Bellman-Ford 算法、Johnson 算法和 Floyd-Warshall 算法。 最小生成树:Prim 算法和 Kruskal 算法。 组件:强连接组件和双连接组件(和关节点)。 Flow Algorithms:Goldberg 的 ...

    ACM算法模板集锦(几何,结构,其他,数论,数值计算,图论)

    最短路径(单源bellman_ford邻接阵形式) 最短路径(单源dijkstra邻接阵形式) 最短路径(单源dijkstra_bfs邻接表形式) 最短路径(单源dijkstra_bfs正向表形式) 最短路径(单源dijkstra+binary_heap邻接表形式) 最短...

Global site tag (gtag.js) - Google Analytics