首页 技术 正文
技术 2022年11月18日
0 收藏 638 点赞 5,027 浏览 1451 个字

核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止。

设到A点的最短路径上,A点前驱节点为B,则该路径包含到达节点B的最短路径。

S集合代表已经探索过的节点,U集合表示未探索过的节点。

时间复杂度为O(n^2)

具体过程见下图和表

基础算法之Dijkstra最短路径

基础算法之Dijkstra最短路径

C++代码如下:

 #include<stdio.h>
#define MAXDIS 4294967295
using namespace std; class MatrixGraphic{
public:
MatrxiGraphic(int number=){
this->vertexNum = number;
vertex = new int[vertexNum];
arc = new int *[vertexNum];
for(int i=;i<vertexNum;i++)
{
arc[i]=new int[vertex];
for(int j=;j<vertexNum;j++)
{
arc[i][j] = MAXDIS;
}
}
} int getValueOfEdge(int start,int end)
{
return arc[start][end];j
}
int getVertexNumber()
{
return vertexNum;
} void setValueOfEdge(int start,int end,int value)
{
this->arc[start][end] = value;
}
private:
int vertexNum;
int *vertex;
int **arc;
} void dijkstra(MatrixGraphic *graphic,int s,int *dist,int *prev)
{
int vertexNUm = graphic->getVertexNumber();
bool *S = new bool[vertexNum];
for(int i=;i<vertexNum;i++)
{
dist[i]=graphic->getValueOfEdge(s,i);
S[i]=false;
if(dist[i]==MAXDIS)
{
prev[i]=-;
}
else
{
prev[i]=s;
}
} dist[s]=;
S[s] = true; for(int i=;i<vertexNum;i++)
{
int temp = MAXDIS;
int u=s;
for(int j=;j<vertexNum;j++)
{
if(!S[j] && dist[j]<temp)
{
u=j;
temp = dist[j];
}
}
S[u]=true;
for(int j=;j<vertexNum;j++)
{
int edge = graphic->getValueOfEdge(u,j);
if(!S[i] && edge<MAXDIS)
{
int newDist = dist[u]+edge;
if(newDist<dist[j])
{
dist[j]=newDist;
prev[j]=u;
}
}
}
} for(int i=;i<vertexNum;i++)
{
int *stack = new int[vertexNum];
int top = ;
stack[top]=i;
top++;
int tempVertex = prev[i];
while(tempVertex != s)
{
stack[top]=tempVertex;
top++;
tempVertex = prev[tempVertex];
}
stack[top] = s;
for(int j=top;j>=;j--)
{
if(j!=)
{
cout<<stack[top]<<"->";
}
else
{
cout<<stack[top]<<endl;
}
}
}
}
上一篇: prior_box层
下一篇: ActionBar 的应用
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,557
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898