最短路

易错点:判断重边
易错点:多组数据输入,每次都要对邻接矩阵初始化
重点:以起点为出发点

最短路:从一点走到另一点即可
最小生成树:遍历每一个点

til the cow come home

poj 2387
Dijkstra算法

基本思想

整个算法都是以起点作为出发点,研究从起点到某点的最短距离,最终dist存放从起点到未纳入路径的点的最短距离。

各变量说明

int map[M][M]:邻接矩阵,存放每两点之间的路程,初始化时均设为INF,根据题设输入路程。需要注意:

  • 1-2的距离即放在[1][2],有放在[2][1]需要一并输入
  • 可能会有多次输入一条边的情况,两点之间有两条路,所以输入的时候要首先判断一下新的输入是不是比旧的短
memset(map, 0x0f, sizeof(map));

memset 包含在cstring库中

bool flag[M]:某个点是否已经纳入路径中,是不是已经找过某个点,初始化为false
int dist[M]:目前从起点到其余各点的最短距离,这个dist在整个程序中有效,最终结果由dist输出。初始化为INF,即没有路

其实dist真正有用的部分在于记录到未纳入路径的点的距离,所以只需要关注/更新未纳入路径点的dist

dist的意义与最小生成树不同

步骤

  1. 把起点纳入路径,dist[M]初始化为从起点到其余各点的路径
  2. 循环n-1次,每一次都纳入一个新的点,循环完以后所有的点都纳入路径
    2.1 在还未纳入路径的点中找到dist[i]最短的点将它纳入路径
    2.2 更新这个新的点对dist的影响
    即加入新的点后最短距离将变为 min ( 原先起点到该点的最短距离,起点->新的点->该终点)
if(flag[i]==false)       //只关心还未纳入路径的点的dist
    dist[i]=min(dist[i], dist[newnode]+map[newnode][i];

程序见document\language C\prepare\shortest path

你可能感兴趣的:(最短路)