Dijkstra最短路径算法 (6)

        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];

            }

        }

    }

    //输出最终的结果

    for(i=1;i<=n;i++)

        printf("%d ",dis[i]);

    getchar();

    getchar();

    return 0;

}

可以输入以下数据进行验证。第一行两个整数n  m。n表示顶点个数(顶点编号为1~n),m表示边的条数。接下来m行表示,每行有3个数x y z。表示顶点x到顶点y边的权值为z.

6 9

1 2 1

1 3 12

2 3 9

2 4 3

3 5 5

4 3 4

4 5 13

4 6 15

5 6 4

运行结果是

0 1 8 4 13 17

通过上面的代码我们可以看出,这个算法的时间复杂度是O(N2)。其中每次找到离1号顶点最近的顶点的时间复杂度是O(N),这里我们可以用“堆”(以后再说)来优化,使得这一部分的时间复杂度降低到O(logN)。另外对于边数M少于N2的稀疏图来说(我们把M远小于N2的图称为稀疏图,而M相对较大的图称为稠密图),我们可以用邻接表(这是个神马东西?不要着急,下周再仔细讲解)来代替邻接矩阵,使得整个时间复杂度优化到O( (M+N)logN )。请注意!在最坏的情况下M就是N2,这样的话MlogN要比N2还要大。但是大多数情况下并不会有那么多边,因此(M+N)logN要比N2小很多。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdggd.html