感谢ACM队员的无私分享,以下是内容正文:
(1)首先先解释一下单源最短路径:
1)容易的解释:指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”
2)官方解释:给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。
(2)解释一下Dijkstra算法:
例如求A点到B、C、D、E、F顶点的最短路径;
我们可以先这样设想:
1)先把所有的点到另一个点的长度全部初始化为无穷大 ,本身到本身则初始化为0,再输入数值;
第一:将所有点到点初始化为无穷大
代码大致如下:
const int INF = 0x3f3f3f3f; //为无穷大;int G[2000][2000];int N; //N为点的个数;for (i = 1; i <= N; i++){
for (j = 1; j <= N; j++) {
G[i][j] = INF; }}
第二:将本身到本身初始化为0 ;因为本身到本身的距离就为0;
for (int i = 1; i <= N; i++){
G[i][i] = 0; //本身到本身距离为0;}
第三:输入数据:
对应下面的表格:
代码实现大概如下:
int M; //M为边的个数;int x, y; // x ,y 为同一边的两个点;int D; //D 为题目给的边的权值;for (i = 1; i <= M; i++){
cin >> x >> y >> D; if (G[x][y] > D) {
G[x][y] = D; G[y][x] = D; }}//上面我们已经把点到其他点的距离初始化为无穷大,把本身到本身初始化为0;//那么上面这个循环的化,我们可以把题目给的两点之间的权值输入;//题目给的权值一定为正值,所以比0大,故本身到本身的距离还是维持为0;//而小于无穷大,所以用上面那个循环可把边的权值输入;
2)我们还需用一个一维数组d来存储A顶点到其余各个顶点的初始路程
下面我们来模拟一下:
这是输入最初数据的表格: