dijkstra算法两种不同初始化的比较

dijkstra算法大家都很熟悉的了,咱废话少说,贴代码


memset(book, 0, sizeof(book));         ///预处理初始化
    for(int i=1; i<=n; i++) 
    
        dis[i] = (i == 1 ? 0 : INF);
    for(int i=1;i<=n;i++)
        dis[i]=num[1][i]; ///初始化dis数组,这里是1号点到其余各个顶点的初始路程
    
    book[1]=1;  ///注意此处跟下文的不同,这里把源点标记
    
    for(int i=1; i<n; i++){         ///dijkstra,这里只需n-1次
        int x, m = INF;
        for(int y=1; y<=n; y++)
            if(!book[y] && dis[y] < m){ ///找离源点最短的距离
            x = y;  ///最短距离的下标
            m = dis[y];  ///最短距离
        }
        book[x] = 1; ///标记,表示源点到x点距离已经确定好了
        
        for(int y=1; y<=n ;y++) dis[y] = min(dis[y], dis[x] + num[x][y]);///松弛操作
            
    }
    for(int i=1;i<=n;i++) ///输出更新的源点到其余各个顶点的更新的最短距离
    printf("%d ",dis[i]);  
    putchar('\n');

memset(book, 0, sizeof(book));         ///预处理初始化
    for(int i=1; i<=n; i++) 
    
        dis[i] = (i == 1 ? 0 : INF);///INF表示很大的一个值
        ///注意此处没有将源点标记,这是一个不同的
    for(int i=1; i<=n; i++){         ///dijkstra这里需n次
        int x, m = INF;
        for(int y=1; y<=n; y++)
            if(!book[y] && dis[y] < m){ ///找离源点最短的距离
            x = y;  ///最短距离的下标
            m = dis[y];  ///最短距离
        }
        book[x] = 1; ///标记,表示源点到x点距离已经确定好了
        
        for(int y=1; y<=n ;y++) dis[y] = min(dis[y], dis[x] + num[x][y]);///松弛操作
            
    }
    for(int i=1;i<=n;i++)
    printf("%d ",dis[i]);
    putchar('\n');
 
 


第一篇代码,初始化源点到其余各个顶点的初始距离,并一开始就标记的源点。而第二篇没有初始化的源点到其余各个顶点的初始距离,只把各个距离初始化为INF,并把源点到源点的距离初始化为0,刚开始不标记

对于第二篇代码,刚进去之后,找的最小值m,肯定是源点,因为其余点都是INF,紧接着松弛完后,最终得到的dis数组的值跟

第一篇代码初始时赋的值时一样的。还有第一篇因为刚开始初始化了源点到其余各个顶点的距离,所以只需n-1次松弛就ok了,而第二篇就得需要n次松弛。这就是他们之间的不同,挑篇喜欢的用就行了。


猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/80082611