最短路径 - 狄克斯拉特算法 Dijkstra - C语言实现

单源最短路径。源点到其余各个顶点的最短路径。

最短路径 - 狄克斯拉特算法 Dijkstra - C语言实现_第1张图片
最短路径 - 狄克斯拉特算法 Dijkstra - C语言实现_第2张图片
例如求1号顶点到其余各点的最短路径,不停更新dis数组即可。
最短路径 - 狄克斯拉特算法 Dijkstra - C语言实现_第3张图片

基本思想:
每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。

/*dis数组初始化*/
void disInit(int sourcePoint,int n,int e[10][10],int dis[10]){
    for(int i=1;i<=n;i++)  dis[i]=e[sourcePoint][i];
}

/*book数组初始化*/
void bookInit(int sourcePoint, int n,int book[10]){
    for(int i=1;i<=n;i++) book[i]=0;
    book[sourcePoint]=1;
}
/*Dijkstra 核心代码*/
void Dijkstra(int n,int e[10][10],int dis[10],int book[10]){
    int min,i,j,u,v;
    for(i=1;i<=n-1;i++){
        //找到离SourcePoint号顶点最近的顶点
        min = inf;
        for(j=1;j<=n;j++){
            if(book[j]==0 && dis[j]<min){
                min = dis[j];
                u=j;
            }
        }
        book[u]=1;
        for(v=1;v<=n;v++){
            if(e[u][v]<inf){
                if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v];
            }
        }
    }
}

算法复杂度: O ( N 2 ) O(N^2) O(N2),此算法不能解决有负权边的图

  1. 每次找到离 S o u r c e P o i n t SourcePoint SourcePoint最近的顶点的时间复杂度是 O ( N ) O(N) O(N),可以用“堆”来优化至 O ( l o g N ) O(logN) O(logN)
  2. 对于稀疏图,用邻接矩表可以降到 O ( ( M + N ) l o g N ) O((M+N)logN) O((M+N)logN)
    其中 M M M为边数

完整代码与Floyd类似,参考点击


有错误请不吝赐教!!谢谢:)

你可能感兴趣的:(数据结构)