最短路径算法

K Shortest Paths算法之Eppstein algorithm Eppstein的算法是David Eppstein于1998年提出的一种高效且易于实现的k条最短路径寻找方法。 阅读详情

 

 

 

Floyd算法

          0        1         2        3        4        5

 

0        0        1        ∞       ∞      5        4

1        1        0         8        ∞      ∞      1

2       ∞       8         0        1        ∞      3

3       ∞      ∞        1        0        3        5 

 

4       5        ∞       ∞       3        0        2

 

5       4         1        3         5        2        0

Floyd算法过程描述如下:
  1、 首先S以边集M初始化,得到所有的直接连通代价;
  2、 依次考虑第k个结点,对于S中的每一个S[i][j],判断是否满足:
  S[i][j]>S[i][k]+S[k][j],如果满足则用S[i][k]+S[k][j]代替S[i][j],此为第k步;
  3、 k循环取遍所有结点,算法结束时,S为最终解。

#include <stdio.h>

#include <stdlib.h>

main()

{int i,j,k,temp,number,a[6][6],d[6][6],r[6][6];

 k=0;number=0;

 for(i=0;i<6;i++)

    for(j=0;j<6;j++)

      {printf("a[%d][%d]=",i,j);

       scanf("%d",&temp);

       a[i][j]=temp;

       }

 for(i=0;i<6;i++)

    for(j=0;j<6;j++)

    {printf("a[%d][%d]=%d   ",i,j,a[i][j]);

     if(j==6-1) printf("/n");

     }

for(i=0;i<6;i++)

    for(j=0;j<6;j++)

      {

       d[i][j]=a[i][j];

       r[i][j]=a[i][j];

       }

while(number<6)

{

 for(i=0;i<6;i++)

  for(j=0;j<6;j++)

    for(k=0;k<6;k++)

     if(d[i][k]+d[k][j]<d[i][j])

     {

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

      r[i][j]=d[i][j];

     }

 number=number+1;

 }

for(i=0;i<6;i++)

   for(j=i+1;j<6;j++)

    printf("r[%d][%d]=%d/n ",i,j,r[i][j]);

 getch();

}

 

r[0][1]=1

r[0][2]=5

r[0][3]=6

r[0][4]=4

r[0][5]=2

r[1][2]=4

r[1][3]=5

r[1][4]=3

r[1][5]=1

r[2][3]=1

r[2][4]=4

r[2][5]=3

r[3][4]=3

r[3][5]=4

r[4][5]=2

 

 

 

 

 

 

1 经典Dijkstra算法的主要思想

  算法介绍
Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻发现的。算法解决的是有向图中最短路径问题。

举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离。 Dijkstra算法可以用来找到两个城市之间的最短路径。

Dijkstra算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。 我们以V表示G中所有顶点的集合。 每一个图中的边,都是两个顶点所形成的有序元素对。(u,v)表示从顶点u到v有路径相连。 我们以E所有边的集合,而边的权重则由权重函数w: E → [0, ∞]定义。 因此,w(u,v)就是从顶点u到顶点v的非负花费值(cost)。 边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值,就是该路径上所有边的花费值总和。 已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低花费路径(i.e. 最短路径)。 这个算法也可以在一个图中,找到从一个顶点s到任何其他顶点的最短路径。

算法描述
这个算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。初始时,源点s的路径长度值被赋为0(d[s]=0), 同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。 Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路径。这条路径的长度是d+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过组织因而当d达到它最终的值的时候没条边(u,v)都只被拓展一次。

算法维护两个顶点集S和Q。集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。集合S初始状态为空,而后每一步都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d值的顶点。当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进行拓展。  

  

#include "stdio.h"
struct vertex
{
 int name;
 int tag;
 };
 
main()
{
 int i,j,k,t,kt,temp,tag_number,min;
 struct vertex s[6];
 int dist[6],a[6][6],path[6][6];
 for(i=0;i<6;i++)
   for(j=0;j<6;j++)
   {
    printf("a[%d][%d]=",i,j);
    scanf("%d",&a[i][j]);
    }
 
 for(i=0;i<6;i++)
   dist[i]=a[0][i];
 
 for(i=0;i<6;i++)
   for(j=0;j<6;j++)
      path[i][j]=-1;
 
 for(i=0;i<6;i++)
   {
    s[i].name=i;
    s[i].tag=0;
    }
 
 s[0].tag=1;
 path[0][0]=0;
 tag_number=1;
 
 while(tag_number<6)
   {
    for(i=0;i<6;i++)
     {
      if(s[i].tag==0)
       {
        for(j=0;j<6;j++)
          if((s[j].tag==1)&&(dist[j]+a[j][i]<dist[i]))
         dist[i]=dist[j]+a[j][i];
        }
     }
    min=100;
    for(k=0;k<6;k++)
     {
      if((s[k].tag==0)&&(dist[k]<min))
      {
       min=dist[k];
       t=k;
       }
     }
 
   dist[t]=min;
   s[t].tag=1;
   printf("The vertex %d has been selected!/n",t);
   k=t;
   temp=0;
   for(i=0;i<6;i++)
       if((s[i].tag==1)&&(i!=k)&&(dist[k]==dist[i]+a[i][k]))
       {
        while(path[i][temp]!=-1)
        temp++;
        kt=j=0;
         for(kt=0;kt<temp;kt++)
         {
          path[k][kt]=path[i][j];
          j++;
         }
        path[k][kt]=k;
       }
   tag_number++;
 
   }
 
 for(i=0;i<6;i++)
    printf("dist[%d]=%d/n",i,dist[i]);
 
 for(i=0;i<6;i++)
   for(j=0;j<6;j++)
    if(path[i][j]!=-1)
      printf("path[%d][%d]=%d ",i,j,path[i][j]);
    else
      printf("/n");
 
 getch();
 
}
 
dist[0]=0
dist[1]=1
dist[2]=3
dist[3]=4
dist[4]=6
dist[5]=2
path[0][0]=0 
path[1][0]=0 path[1][1]=1 
path[2][0]=0 path[2][1]=1 path[2][2]=2 
path[3][0]=0 path[3][1]=1 path[3][2]=2 path[3][3]=3 
path[4][0]=0 path[4][1]=1 path[4][2]=5 path[4][3]=4 
path[5][0]=0 path[5][1]=1 path[5][2]=5
 
 


Windows10连WiFi能上QQ但打不开网页?3分钟搞定DNS手动配置(附常见DNS推荐) 本文针对Windows 10用户常见的“能连WiFi上QQ但无法打开网页”问题,提供了详细的诊断与解决方案。核心在于DNS配置故障,文章通过图文并茂的方式,指导用户如何手动配置DNS服务器,并推荐了Google Public DNS、Cloudflare DNS等常见公共DNS服务,帮助用户快速恢复网络访问。 阅读详情

相关推荐

关于最短路径算法的理解

“最短路径算法:Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等。​从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。” 我们解决最短路径问题,常用的是Dijkstra与Floyd算法 Dijkstra(迪杰斯特拉)算法 他的算法思想是按路径长度递增的次序一步一步并入来求取,是贪心算法的一个应用,用来解决单源点到其余顶点的...

汪雯琦的博客 5142

Top K 算法详解

们要找的Top10了。      不难分析出,这样,算法的最坏时间复杂度是N*K, 其中K是指top多少。        算法三:堆       在算法二中,我们已经将时间复杂度由NlogN优化到N*K,不得不说这是一个比较大的改进了,可是有没有更好的办法呢?       分析一下,在算法二中,每次比较完成之后,需要的操作复杂度都是K,因为要把元素插入到一个线性表之中,而且采用的是顺序比较

public 1086

最短路径算法(算法篇)

本篇讲述图论算法中的最短路径算法,有bfs,floyd和dijkstra算法

hellmorning的博客 2274

K条最短路径问题

最短路径的并行算法综述 中国科技大学 陈艾通常情况下,最短路径问题分为:单源最短路径和所有顶点对间的最短路径。这两类问题从不同的角度描述问题,但有一个共同的缺陷:这里的最短路径指两点之间最短的那一条路径,不包括次短、再次短等等路径。这样的最短路径问题比较狭义。实际情况中,例如,用户在使用咨询系统或决策支持系统时,希望得到最优的决策参考外,还希望得到次优、再次优等决策参考,这同样反映在最短路径问

Rough.Potato 3729

【JavaScript算法实践】最短路径算法

目录前言一、Dijkstra算法算法实现二、Floyd-Warshall 算法算法实现 前言 最短路问题是图问题中的经典问题,这类问题在生活中非常常见,我们(特别是生活在大城市的人)出门在外,无论是驾车还是乘坐公共交通工具,甚至步行,都会求助于高德地图、百度地图等定位和导航程序。我们可能会有其他的考虑:例如如何乘车、换乘?如何避开拥堵路段?但根本的问题仍然是:哪条路径最短? 在图问题中,这一问题对应的算法被称为最短路径算法。本文介绍其中两种非常著名算法的JavaScript实现: Dijkstra算法和F

tmc1655337354的博客 2773

Eppstein-Algorithm-in-Python:Eppstein 的算法使用图转换技术。 该模型还可以找到从给定源 s 到图中每个顶点的 K 条最短路径,总时间为 O(m + n log n + kn)。 在 Python 中实现

Eppstein-Python 中的算法

图的五种最短路径算法

本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,费罗伊德算法,迪杰斯特拉算法,Bellman-Ford 算法。1)深度或广度优先搜索算法(解决单源最短路径)从起点开始访问所有深度遍历路径或广度优先路径,则到达终点节点的路径有多条,取其中路径权值最短的一条则为最短路径。下面是核心代码:void dfs(int cur,int dst){ if(minpath&lt;dst) r...

qq_35710556的博客 7万+

k最短路径 k shortest path problem matlab 代码 Yen

两个Yen的k最短路径算法(matlab),一个Eppstein的k最短路径算法(C#)。 两个Yen的k最短路径算法(matlab),一个Eppstein的k最短路径算法(C#)。

【MATLAB】最短路径Floyd算法

目录1.Floyed算法1.1适用范围1.2算法思想1.3实例2.代码2.1floyd函数2.2调用函数 1.Floyed算法 1.1适用范围 ∙\bullet∙ 求每队顶点的最短路径 ∙\bullet∙ 有向图、无向图和混合图 1.2算法思想 直接在图的带权邻接矩阵中用插入顶点的方法依次递推地构造出n个矩阵D(1),D(2)…D(n)(每次加入一个点然后更新最短路径矩阵D),D(n)是图的最短距离矩阵,同时引入一个后继点矩阵path记录两点间的最短路径。 1.3实例 对于如下无向图: 我们可以得如下

taoxing 1万+

Eppstein K最短路 程序代码 C#

Eppstein K最短路 程序代码 C#

前k条最短路径算法实例

前k条最短路径的算法在国内鲜有研究,本程序以此算法为蓝图,分别采用了Martin(KSP1程序)先生以及Yen先生(KSP2)的算法完成了前k条旅游最短路径的选择。

求解两点间最短路径的算法

最短路径算法1.Dijkstra算法2.Bellman-Ford算法3.SPFA算法4.Floyd算法几种最短路径算法的对比Dijkstra算法、Bellman-Ford算法和SPFA算法的对比Dijkstra算法和Floyd算法的对比 最短路径算法 单源最短路算法:已知起点,求到达其他点的最短路径。         常用算法:Dijkstra算法、Bellman-Ford算法、SPFA算法。 多源最短路算法:求任意两点之间的最短路径.

大彤小忆的博客 1万+

Jeff Erickson算法大全

《算法》基于伊利诺伊大学厄巴纳 - 香槟分校的计算机科学教授 Jeff Erickson 为多个算法课程写的讲义集合,这本教科书已经在伊利诺伊大学厄巴纳 - 香槟分校出版,自 1999 年 1 月以来 Jeff Erickson 每年都会使用这本书教授一次算法课程。由于本科理论课程的变化,Jeff Erickson 在 2016 年对讲义进行了重大修订;本书是 Erickson 教授修订的最基础课程材料的一部分,主要反映了新的初级理论课程的算法内容 算法这个词有一股魔力,似乎任何工作任务加上它就能变得自动化,任何神奇的新发现也都离不开算法的帮助。那么什么是算法,我们又该如何学习算法呢?

最短路径的四种算法

最短路径四种算法 1 2 3 4 Floyd Dijkstra Bellman-Ford 队列优化的Bellman-Ford 一,只有四行的算法——Floyd-Warshall 假设求顶点ViViVi到VjVjVj的最短路径。弗洛伊德算法依次找从ViViVi到VjVjVj,中间经过结点序号不大于000的最短路径,不大于111的最短路径,…直到中间顶点序号不大于n−1n-1n−1...

我の名字 1万+

java实现K条最短路(KSP)

KSP问题。java实现的K条最短路径寻路。包含测试用例。。。

CANoe/CANalyzer新手必看:从零配置到报文分析的完整流程(附B站官方教程实操)

本文为CANoe/CANalyzer新手提供从零配置到报文分析的完整流程指南,涵盖硬件连接、工程配置、报文捕获及信号级分析等关键步骤。通过详细的实操案例和B站官方教程,帮助工程师快速掌握汽车电子总线分析工具的核心应用,提升诊断效率与通信系统理解。

y7z8a的博客 775
上一篇: 乐逍遥
programsun
博客等级 码龄20年 3粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值