先放出原作者的链接:http://blog.51cto.com/ahalei/1387799
以下仅是我的学习过程,以便用时方便查找。
Dijkstra为“单源最短路径算法”
对应的邻接矩阵是—->
以1为起始地点,用Dijstra算法最终可以得到是到其他各点(2,3,4,5,6)的最短路径.
e[6][6]:表示矩阵的大小
dis[6]:表示1到其他各点的距离,如:dis[3]:1到3的距离
book[6]:表示6个点被标记的情况,如:book[1]=1,表示1点已经被标记过,=0,表示未被标记过。
n, m:分别表示图的顶点数和边数
t1, t2, t3:分别表示开始顶点,结束顶点,边上的权值
u:为标记的点中dis[i]值最小时对应的i
min:最小距离
过程解读:
5结点遍历完之后遍历6,由于6没有指向别的结点,所以直接设定Book[6]=1
算法结束!
#include <iostream>
using namespace std;
int main()
{
int inf = 99999999;
int e[10][10], dis[10], book[10], n, m, t1, t2, t3, u, min;
//scanf_s("%d %d", &n, &m);///n表示顶点个数,m表示边的条数
cin >> n >> m;
///初始化
for (int i = 1; i <= n; i++)///这里创建的是一个邻接矩阵,n*n的矩阵
for (int j = 1; j <= n; j++)
if (i == j) e[i][j] = 0;
else e[i][j] = inf;
///读入边
for (int i = 1; i <= m; i++)
{
//scanf_s("%d %d %d", &t1, &t2, &t3);
cin >> t1 >> t2 >> t3;
e[t1][t2] = t3;
}
///初始化dis数组,这里要求的是1号顶点到其余各点的初始路程
for (int i = 1; i <= n; i++)
{
dis[i] = e[1][i];
}
///初始化book数组,这里面存的是已经被标记过的点
for (int i = 1; i <= n; i++)
book[i] = 0;
book[1] = 1;///表示1点是已经被标记过的点
///核心代码
for (int i = 1; i <= n - 1; i++)
{
min = inf;
for (int j = 1; j <= n; j++)///找到dis中未标记点中的最小值
{
if (book[j] == 0 && dis[j]<min)
{
min = dis[j];
u = j;
}
}
book[u] = 1;
for (int k = 1; k <= n; k++)///找到有箭头指向的结点
{
if (e[u][k]<inf)
{
if (dis[k]>dis[u] + e[u][k])
dis[k] = dis[u] + e[u][k];
}
}
}
///输出最终结果
for (int i = 1; i <= n; i++)
//printf("%d ", dis[i]);
cout << dis[i]<<" ";
return 0;
}
测试数据:
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
运行结果:
0 1 8 4 13 17