用C++求dijkstra算法求最短路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C++求dijkstra算法求最短路径相关的知识,希望对你有一定的参考价值。

问题描述:从键盘上输入一个图的基本信息(图用邻矩阵表示)
1)首先输入图的结点数->num
2)依次输入图的各条边
3)程序所能达到的功能:输出用dijkstra算法求出的一条最短路径。

/**************************************************************
* 给定一个带权有向图G = (V,E),其中每条边的权是一个非负整数。*
* 另外还给定V中的一个顶点,称为源。现在我们要计算从源到所有其 *
* 他各顶点的最短路长度。这里路径长度是路上各边权之和。这个问 *
* 题通常称为单源最短路径问题。 *
***************************************************************/
#include<iostream.h>

#define INFINITE 100

void main()

int j,i,n,k,t,**w,*s,*p,*d;

cout<<"input the value of n:";
cin>>n;
cout<<endl;

d = new int[n];
s = new int[n];
p = new int[n];
w = new int*[n];

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

w[i] = new int[n];


for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
cin>>w[i][j];

for(s[0] = 1,i = 1; i < n; i++)

s[i] = 0;
d[i] = w[0][i];
if(d[i] < INFINITE)
p[i]=0;
else
p[i]=-1;


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

t = INFINITE;
k = 1;
for(j = 1; j < n; j++)
if((!s[j]) && (d[j] < t))

t = d[j];
k = j;

s[k]=1;//point k join the S
for (j = 1; j < n; j++)
if((!s[j]) && (d[j] > d[k] + w[k][j]))

d[j] = d[k] + w[k][j];
p[j] = k;



cout<<"从源点到其它顶点的最短距离依次如下:";
for(i=1;i<n;i++) cout<<d[i]<<" ";
cout<<endl;


/*********
顶点个数用n表示,这里给出的例子n=6
100 1 12 100 100 100
100 100 9 3 100 100
100 100 100 100 5 100
100 100 4 100 13 15
100 100 100 100 100 4
100 100 100 100 100 100
具体例子见 电子工业出版社 《算法设计技巧与分析》148页
************/
参考技术A /**************************************************************
*
给定一个带权有向图G
=
(V,E),其中每条边的权是一个非负整数。*
*
另外还给定V中的一个顶点,称为源。现在我们要计算从源到所有其
*
*
他各顶点的最短路长度。这里路径长度是路上各边权之和。这个问
*
*
题通常称为单源最短路径问题。
*
***************************************************************/
#include<iostream.h>
#define
INFINITE
100
void
main()

int
j,i,n,k,t,**w,*s,*p,*d;
cout<<"input
the
value
of
n:";
cin>>n;
cout<<endl;
d
=
new
int[n];
s
=
new
int[n];
p
=
new
int[n];
w
=
new
int*[n];
for(i
=
0;
i
<
n;
i++)

w[i]
=
new
int[n];

for(i
=
0;
i
<
n;
i++)
for(j
=
0;
j
<
n;
j++)
cin>>w[i][j];
for(s[0]
=
1,i
=
1;
i
<
n;
i++)

s[i]
=
0;
d[i]
=
w[0][i];
if(d[i]
<
INFINITE)
p[i]=0;
else
p[i]=-1;

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

t
=
INFINITE;
k
=
1;
for(j
=
1;
j
<
n;
j++)
if((!s[j])
&&
(d[j]
<
t))

t
=
d[j];
k
=
j;

s[k]=1;//point
k
join
the
S
for
(j
=
1;
j
<
n;
j++)
if((!s[j])
&&
(d[j]
>
d[k]
+
w[k][j]))

d[j]
=
d[k]
+
w[k][j];
p[j]
=
k;


cout<<"从源点到其它顶点的最短距离依次如下:";
for(i=1;i<n;i++)
cout<<d[i]<<"
";
cout<<endl;

/*********
顶点个数用n表示,这里给出的例子n=6
100
1
12
100
100
100
100
100
9
3
100
100
100
100
100
100
5
100
100
100
4
100
13
15
100
100
100
100
100
4
100
100
100
100
100
100
具体例子见
电子工业出版社
《算法设计技巧与分析》148页
************/

以上是关于用C++求dijkstra算法求最短路径的主要内容,如果未能解决你的问题,请参考以下文章

最短路径(Dijkstra算法)

最短路径 深入浅出Dijkstra算法(一)

用Dijkstra算法求最短路径

Dijkstra算法求最短路径 C++实现

用Dijkstra算法求最短路径的MATLAB程序

a*算法求最短路径和floyd还有dijsktra算法求最短路径的区别?