数组dist[],是当前求到的顶点v到顶点j的最短路径长度

数组path[]存放求到的最短路径,如path[4]=2,path[2]=3,path[3]=0,则路径{0,3,2,4}就是0到4的最短路径

数组S[]存放已经求到了最短路径的结点的集合

算法包括两个并行的for循环:

(1)辅助数组的初始化工作,dist[i]=G.getweight(v,i),时间复杂度为O(n)。

(2)顶点v是第一个求到了最短路径的结点,dist[v]=0,把它加入数组S[]。

(2)进行最短路径求解工作的二重嵌套循环,时间复杂度为O(n^2)。大循环重复n-1次,每次求出一个结点的最短路径长度dist[u]和最短路径path[u]:

    进行n次循环,每次从没有加入S[]的顶点中找出最短路径长度dist[i]最小的点,加入集合。

    进行n次循环,每次修改和该点相邻接的结点的最短路径长度dist[j]和最短路径path[j](先判断边是否存在)。

最后总的时间复杂度为O(n^2)。

template <class T,class E>
void ShortestPath(Graph<T,E>& G,T v,E dist[],int path[]){ //求到顶点v的最短路径存储在path[]中,最短距离存储在dist[]中
//G为带权有向图
int n=G.NumberOfVertices();
bool *S=new bool[n]; //数组S存放已经求到了最短路径的结点的集合
int i,j,k;
E w,min;
for (i=; i<n; i++) {
dist[i]=G.getWeight(v,i);
S[i]=false;
if(i!=v && dist[i]<maxValue) path[i]=v;
else path[i]=-;
}
S[v]=true;dist[v]=; //顶点v加入顶点集合
for (i=; i<n-; i++) {
min=maxValue; //每次循环前重置min和u
int u=v;
for (j=; j<n; j++)
if(S[j]==false && dist[j]<min){ //选不在S中具有最短路径的顶点u
u=j;
min=dist[j];
}
S[u]=true;
for(k=; k<n; k++){
w=G.getWeight(u,k);
if(S[k]==false && w<maxValue && dist[u]+w<dist[k]){
dist[k]=dist[u]+w;
path[k]=u;
}
}
}
} // 从path数组读取最短路径的算法
template <class T,class E>
void printShortestPath(Graph<T,E>& G,int v,E dist[],int path[]){
cout<<"从顶点"<<G.getValue(v)<<"到其它顶点的最短路径为:"<<endl;
int i,j,k,n=G.NumberOfVerticles();
int *d=new int[n];
for (i=o; i<n; i++)
if(i!=v){
j=i;k=;
while(j!=v){d[k++]=j;j=path[];}
cout<<"顶点"<<G.getValue(i)<<"的最短路径为"<<G.getValue(v);
while(k>){
cout<<G.getValue(d[--k])<<"";
cont<<"最短路径长度为:"<<dist[i]<<endl;
}
}
delete []d;
}

算法-图(1)Dijkstra求最短路径的更多相关文章

  1. POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16425   Accepted: 5797 Descr ...

  2. 图——图的Dijkstra法最短路径实现

    1,最短路径的概念: 1,从有向图中某一顶点(起始顶点)到达另一顶点(终止顶点)的路径中,其权值之和最小的路径: 2,问题的提法: 1,给定一个带权有向图 G 与起始顶点 v,求从 v 到 G 中其它 ...

  3. Dijkstra求最短路径

    单源点的最短路径问题:给定带权有向图G和源点V,求从V到G中其余各顶点的最短路径 Dijkstra算法描述如下: (1)用带权的邻接矩阵arcs表示有向图,arcs[i][j]表示弧<vi,vj ...

  4. Dijkstra求最短路径&例题

    讲了半天好像也许maybe听懂了一点,先写下来233 先整理整理怎么存(开始绕) 最简单的是邻接矩阵存,但是开到10000*10000就MLE了,所以我们用链式前向星存(据说是叫这个名字吧) 这是个什 ...

  5. POJ 2387 Til the Cows Come Home Dijkstra求最短路径

    Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much s ...

  6. 【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D - Silver Cow Party

    https://vjudge.net/contest/66569#problem/D trick:1~N各点到X可以通过转置变为X到1~N各点 #include<iostream> #in ...

  7. 图之Dijkstra算法

    Dijkstra算法是一种求单源最短路的算法,即从一个点开始到所有其他点的最短路.其步骤如下: c语言实现如下:(使用邻接矩阵存储) #include <stdio.h> #include ...

  8. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  9. Dijkstra算法求最短路径(java)(转)

    原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...

随机推荐

  1. JS的执行上下文

    定义 执行上下文时是代码执行时的环境,JS代码在运行前进行编译,那么会生成两部分,一部分是可执行的代码,而另一部分则是执行上下文. 发展 执行上下文所包含的内容是在不断的变化的.它主要分为了三个不同的 ...

  2. Android Zero (开篇)

    Android Zero == 从零开始 本文章主要打算给将要入门Android或刚刚入门Android的小伙伴适用的,开篇的几个案例都会抛弃所有现在用到的新技术和第三方框架,用最原生的方法从0演示, ...

  3. 那些年拿过的shell之springboot jolokia rce

    日穿扫描扫到一个spring boot actuator 可以看到有jolokia这个端点,再看下jolokia/list,存在type=MBeanFactory 关键字 可以使用jolokia-re ...

  4. maven 一些高级用法命令

    发布本地jar到私服 命令 mvn deploy:deploy-file -Dmaven.test.skip=true -Dfile=D:\Downloads\OJDBC-Full\ojdbc6.ja ...

  5. Python修改元组

    Python修改元组:元组中的元素值是不允许修改的,当创建好的时候就是固定不变的.所谓的修改其实是指创建一个新的元组,只是该元组可能是比原来的元组多一个元素或者少一个元素,然后使用新创建好的元组代替原 ...

  6. 线程_multiprocessing异步

    from multiprocessing import Pool import time import os def test(): print("---进程池中的进程---pid=%d,p ...

  7. PHP array_flip() 函数

    ------------恢复内容开始------------ 实例 反转数组中的键名和对应关联的键值: <?php$a1=array("a"=>"red&qu ...

  8. PHP strspn() 函数

    实例 返回在字符串 "Hello world!" 中包含字符 "kHlleo" 的数目: <?php高佣联盟 www.cgewang.comecho st ...

  9. 【问题记录】ajax dataType属性

    最近整理代码,发现一些ajax dataType 属性值设置的问题.下面直接上代码说明下 前台ajax请求 $.ajax({ type: "get", dataType: &quo ...

  10. Java语言特性

    Java的语言特性: 1.语法相对简单 2.面向对象 3.分布性 4.可移植性 5.安全性 6.健壮性 7.解释性 8.多线程 9.动态性与并发性 Java中的面向对象编程: 面向对象程序设计(Obj ...