prime:
visit[index] = true;//最短边对应的另一个点纳入集合
cout << index << " ";
sum += minor;//最小树的总距离长度
for (int j = 0; j < N; j++){
if (!visit[j] && dist[j]>g[index][j]){//更新当前包括之前可连的点(最短),当前这个点a与其他点b的距离可能比之前的其他点c与点b的距离要短,所以要更新。
dist[j] = g[index][j];
}
}
dijkstra:
s[u] = true;
for (int j = 1; j <= n; j++) {//从最小边的点更新之前的与v0的距离
if (!s[j] && dist[u] + map[u][j] < dist[j]) {
dist[j] = dist[u] + map[u][j];
pre[j] = u;//如果有更小边,则说明j的前驱为u
}
}
我也是刚开始学这个东西,看了之后发现两个算法简直就是一模一样,prim算法是用来算最小生成树的,就是求最小的连通值,而dijkstra算法是用来做单源最小路径的。差别也就在这个更新数组的位置,prim更新的是所有已加入集合的点到未加入点的最小距离,为后续继续纳入点。
而dijkstra的更新是指的初始点到所有点的最小距离,自然也就需要原点到这个点的距离+这个点到目标点的距离,来直接和原点到目标点的距离进行判定。然后更新最短距离。综上,我所理解的更新的区别就这么多,我的解释只是非常浅显的,若要深入的理解还需要认真的学习算法的证明和推导过程才行。