最短路

作者: _Cooper_ | 来源:发表于2018-06-03 17:57 被阅读11次

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

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

    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

    相关文章

      网友评论

          本文标题:最短路

          本文链接:https://www.haomeiwen.com/subject/cewjsftx.html