C++版本迪杰斯特拉(Dijkstra)算法原理讲解及代码实现
#include <iostream>
const int g_nMaxNumber
= 100;
const int g_nMaxInt
= 999999;
void Dijkstra(int nNodes
, int nV
, int* pDist
, int* pPrev
, int matrixDistance
[g_nMaxNumber
][g_nMaxNumber
])
{
bool bArr
[g_nMaxNumber
];
for (int i
= 1; i
<= nNodes
; i
++)
{
pDist
[i
] = matrixDistance
[nV
][i
];
bArr
[i
] = false;
if (pDist
[i
] == g_nMaxInt
)
pPrev
[i
] = 0;
else
pPrev
[i
] = nV
;
}
pDist
[nV
] = 0;
bArr
[nV
] = true;
int nTmp
= 0;
int nIndex
= 0;
for (int i
= 2; i
<= nNodes
; i
++)
{
nTmp
= g_nMaxInt
;
nIndex
= nV
;
for (int j
= 1; j
< nNodes
; j
++)
{
if (!bArr
[j
] && pDist
[j
] < nTmp
)
{
nIndex
= j
;
nTmp
= pDist
[j
];
}
}
bArr
[nIndex
] = true;
for (int k
= 1; k
<= nNodes
; k
++)
{
if (!bArr
[k
] && matrixDistance
[nIndex
][k
] < g_nMaxInt
)
{
nTmp
= pDist
[nIndex
] + matrixDistance
[nIndex
][k
];
if (nTmp
< pDist
[k
])
{
pDist
[k
] = nTmp
;
pPrev
[k
] = nIndex
;
}
}
}
}
}
void SearchPath(int* pPrev
, int nStart
, int nEnd
)
{
int nArr
[g_nMaxNumber
];
int nIndex
= 1;
nArr
[nIndex
] = nEnd
;
nIndex
++;
int nTmp
= pPrev
[nEnd
];
while (nTmp
!= nStart
)
{
nArr
[nIndex
] = nTmp
;
nIndex
++;
nTmp
= pPrev
[nTmp
];
}
nArr
[nIndex
] = nStart
;
for (int i
= nIndex
; i
>= 1; i
--)
{
if (i
!= 1)
std
::cout
<< nArr
[i
] << " -> ";
else
std
::cout
<< nArr
[i
] << std
::endl
;
}
}
int main(int argc
, char* argv
[])
{
int nNodes
= 5;
int matrixDistance
[g_nMaxNumber
][g_nMaxNumber
];
matrixDistance
[0][0] = g_nMaxInt
;
matrixDistance
[0][1] = g_nMaxInt
;
matrixDistance
[0][2] = g_nMaxInt
;
matrixDistance
[0][3] = g_nMaxInt
;
matrixDistance
[0][4] = g_nMaxInt
;
matrixDistance
[0][5] = g_nMaxInt
;
matrixDistance
[0][0] = g_nMaxInt
;
matrixDistance
[1][1] = g_nMaxInt
;
matrixDistance
[1][2] = 10;
matrixDistance
[1][3] = g_nMaxInt
;
matrixDistance
[1][4] = 30;
matrixDistance
[1][5] = 100;
matrixDistance
[2][0] = g_nMaxInt
;
matrixDistance
[2][1] = g_nMaxInt
;
matrixDistance
[2][2] = g_nMaxInt
;
matrixDistance
[2][3] = 50;
matrixDistance
[2][4] = g_nMaxInt
;
matrixDistance
[2][5] = g_nMaxInt
;
matrixDistance
[3][0] = g_nMaxInt
;
matrixDistance
[3][1] = g_nMaxInt
;
matrixDistance
[3][2] = g_nMaxInt
;
matrixDistance
[3][3] = g_nMaxInt
;
matrixDistance
[3][4] = g_nMaxInt
;
matrixDistance
[3][5] = 10;
matrixDistance
[4][0] = g_nMaxInt
;
matrixDistance
[4][1] = g_nMaxInt
;
matrixDistance
[4][2] = g_nMaxInt
;
matrixDistance
[4][3] = 20;
matrixDistance
[4][4] = g_nMaxInt
;
matrixDistance
[4][5] = 60;
int nArrPre
[6];
int nArrDist
[6];
for (int i
= 0; i
<= nNodes
; i
++)
{
nArrPre
[i
] = g_nMaxInt
;
nArrDist
[i
] = g_nMaxInt
;
}
std
::cout
<< "邻接矩阵:" << std
::endl
;
for (int j
= 1; j
<= nNodes
; j
++)
{
for (int k
= 1; k
<= nNodes
; k
++)
std
::cout
<< matrixDistance
[j
][k
] << std
::endl
;
}
Dijkstra(nNodes
, 1, nArrDist
, nArrPre
, matrixDistance
);
std
::cout
<< "\n第1个点到第2点的最短距离:" << nArrDist
[2] << std
::endl
;
std
::cout
<< "第1个点到第2点的最短路径:";
SearchPath(nArrPre
, 1, 2);
std
::cout
<< "\n第1个点到第3点的最短距离:" << nArrDist
[3] << std
::endl
;
std
::cout
<< "第1个点到第3点的最短路径:";
SearchPath(nArrPre
, 1, 3);
std
::cout
<< "\n第1个点到第4点的最短距离:" << nArrDist
[4] << std
::endl
;
std
::cout
<< "第1个点到第4点的最短路径:";
SearchPath(nArrPre
, 1, 4);
std
::cout
<< "\n第1个点到第5点的最短距离:" << nArrDist
[5] << std
::endl
;
std
::cout
<< "第1个点到第5点的最短路径:";
SearchPath(nArrPre
, 1, 5);
return 1;
}
zhangyanfeng@ubuntu:
/ZYF$ sudo touch Dijkstra
.cpp
zhangyanfeng@ubuntu:
/ZYF$ sudo vim Dijkstra
.cpp
zhangyanfeng@ubuntu:
/ZYF$ sudo g+
+ -o DijkstraDemo Dijkstra
.cpp
zhangyanfeng@ubuntu:
/ZYF$
ls
bubble
.cpp bubbledemo Dijkstra
.cpp DijkstraDemo insert
.cpp insertdemo merger
.cpp mergerdemo quick
.cpp quickdemo
select.cpp selectdemo shell
.cpp shelldemo
zhangyanfeng@ubuntu:
/ZYF$
./DijkstraDemo
邻接矩阵:
999999
10
999999
30
100
999999
999999
50
999999
999999
999999
999999
999999
999999
10
999999
999999
20
999999
60
0
0
0
0
0
第1个点到第2点的最短距离:10
第1个点到第2点的最短路径:1
-> 2
第1个点到第3点的最短距离:50
第1个点到第3点的最短路径:1
-> 4
-> 3
第1个点到第4点的最短距离:30
第1个点到第4点的最短路径:1
-> 4
第1个点到第5点的最短距离:60
第1个点到第5点的最短路径:1
-> 4
-> 3
-> 5