最短路-Floyd算法和Dijkstra算法

两者在负权问题上不是很好,最好只处理正值

Dijkstra算法的话,为了方便,我认为从i到i点不可达;百部百科解释挺好,那个堆优化挺好的

Floyd算法百部百科也不错,都是老算法了,哪都有资料

博客园这位筒子的写得很好 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

Mathematica下的代码【我也觉得mathematica写很诡异。。。】

(*Dijkstra算法,其思想和Prim有点像,输出的是每个点的前向节点*)
Dijkstra[tu_, dian_, point_] := Module[
  {dis = tu[[point]], pre = Table[point, {i, 1, dian}],
   diannum = dian, visin = Table[False, {i, 1, dian}], k, lval,
   mindis, flag = True},
  visin[[point]] = True;
  k = point;
  While[diannum != 0,
   mindis = Infinity;
   Do[
    If[visin[[i]] == False && dis[[i]] < mindis, mindis = dis[[i]];
     k = i]
    , {i, 1, dian}];

   If[mindis == Infinity, flag = True; Break[]];
   diannum--;
   visin[[k]] = True;

   Do[
    If[visin[[j]], Continue[]];
    lval = tu[[k]][[j]] + dis[[k]];
    If[lval < dis[[j]], dis[[j]] = lval; pre[[j]] = k]
    , {j, 1, dian}]
   ];
  pre
  ]

Dijkstra

Input:
tuer = {{INF, 7, INF, 5, INF, INF, INF}, {7, INF, 8, 9, 7, INF, INF}, {INF, 8, INF, INF, 5, INF, INF}, {5, 9, INF, INF, 15, 6, INF}, {INF, 7, 5, 15, INF, 8, 9}, {INF, INF, INF, 6, 8, INF, 11}, {INF, INF, INF, INF, 9, 11, INF}}

Dijkstra[tuer, 7, 1]

Out:
 {1, 1, 2, 1, 2, 4, 6}

示例

(*Floyd算法,打印输出了长度,函数输出前节点*)
Floyd[tu_, dian_] := Module[
  {path = Table[-1, {i, 1, dian}, {j, 1, dian}], Dis = tu, lenn},
  Do[
   Do[
    Do[
     lenn = Dis[[i, k]] + Dis[[k, j]];
     If[Dis[[i, j]] > lenn, path[[i, j]] = k; Dis[[i, j]] = lenn]
     , {k, 1, dian}]
    , {j, 1, dian}]
   , {i, 1, dian}];
  Print[Dis];
  path
  ]

Floyd

Input:
tuer = {{INF, 7, INF, 5, INF, INF, INF}, {7, INF, 8, 9, 7, INF, INF}, {INF, 8, INF, INF, 5, INF, INF}, {5, 9, INF, INF, 15, 6, INF}, {INF, 7, 5, 15, INF, 8, 9}, {INF, INF, INF, 6, 8, INF, 11}, {INF, INF, INF, INF, 9, 11, INF}}
Floyd[tuer, 7]

During evaluation of Input:
 {{0,7,15,5,14,11,22},{7,0,8,9,7,15,16},{15,8,0,17,5,13,14},{5,9,17,0,14,6,17},{14,7,5,14,0,8,9},{11,15,13,6,8,0,11},{22,16,14,17,9,11,0}}

Out:
{{-1, -1, 2, -1, 2, 4, 6}, {-1, -1, -1, -1, -1, 4,
  5}, {2, -1, -1, 2, -1, 5, 5}, {-1, -1, 2, -1, 6, -1, 6}, {2, -1, -1,
   6, -1, -1, -1}, {4, 4, 5, -1, -1, -1, -1}, {6, 5, 5,
  6, -1, -1, -1}}

示例

时间: 2024-10-24 20:51:20

最短路-Floyd算法和Dijkstra算法的相关文章

九度 1447 最短路径 (Floyd算法和 Dijstra算法)

题目: 给出点的个数N.边的个数M(N<=100,M<=10000),以及M条边(每条边有3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表A到B点的边权值为C).求点1到点N的最短路径长.N=M=0表示输入结束. Floyd算法: 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 using namespace std; 5 #defi

单源最短路径算法——Bellman-ford算法和Dijkstra算法

 BellMan-ford算法描述 1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0; 2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离:(运行|v|-1次) 3.检验负权回路:判断边集E中的每一条边的两个端点是否收敛.如果存在未收敛的顶点,则算法返回false,表明问题无解:否则算法返回true,并且从源点可达的顶点v的最短距离保存在 dist[v]中. 1 BELLMAN-FORD

Dijkstra算法和Floyed算法

写的比较好的三篇文章 Floyed算法 最短路径-Dijkstra算法和Floyed算法 最短路径之Dijkstra算法和Floyed算法 哈哈,他山之石,可以攻玉 自己有心得,慢慢补充

poj 3114(korasaju算法和dij算法)

Countries in War Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2407   Accepted: 751 Description In the year 2050, after different attempts of the UN to maintain peace in the world, the third world war broke out. The importance of indus

SM2算法和RSA算法简介

SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能.速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法.国家密码管理局于2010年12月17日发布了SM2算法,并要求现有的基于RSA算法的电子认证系统.密钥管理系统.应用系统进升级改造,使用SM2算法. SM2算法和RSA算法简介 RSA公钥加密算法是美国计算机学家Ron Rivest.Adi Shamir和Leonard Adleman于1977年提出,是最早的公钥加密算法之一,在全球范围

使用Apriori算法和FP-growth算法进行关联分析(Python版)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

链接挖掘算法之PageRank算法和HITS算法

参考资料:http://blog.csdn.net/hguisu/article/details/7996185 更多数据挖掘算法:https://github.com/linyiqun/DataMiningAlgorithm 链接分析 在链接分析中有2个经典的算法,1个是PageRank算法,还有1个是HITS算法,说白了,都是做链接分析的.具体是怎么做呢,继续往下看. PageRank算法 要说到PageRank算法的作用,得先从搜索引擎开始讲起,PageRank算法的由来正式与此相关. 搜

最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,(u,v)为其中一条边. 构造最小生成树,要解决以下两个问题: (1).尽可能选取权值小的边,但不能构成回路(也就是环). (2).选取n-1条恰当的边以连接网的n个顶点. Prim算法的思想: 设G = (V,E)是连通带权图,V = {1,2,-,n}.先任选一点(一般选第一个点),首

Prim算法和Kruskal算法的正确性证明

今天学习了Prim算法和Kruskal算法,因为书中只给出了算法的实现,而没有给出关于算法正确性的证明,所以尝试着给出了自己的证明.刚才看了一下<算法>一书中的相关章节,使用了切分定理来证明这两个算法的正确性,更加简洁.优雅并且根本.相比之下,我的证明带着许多草莽气息,于此写成博客,只当是记录自己的思考 ------------------------------------------- 说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的