Dijkstra算法

来源:互联网 发布:au视频软件下载 编辑:程序博客网 时间:2024/05/29 09:54
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。

其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。

初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。

 

关键代码:

 

void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum])

{

    bool s[maxnum];    // 判断是否已存入该点到S集合中

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

    {

        dist[i] c[v][i];

        s[i] 0;     // 初始都未用过该点

        if(dist[i] == maxint)

            prev[i] 0;

        else

            prev[i] v;

     }

    dist[v] 0;

    s[v] 1;

 

// 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S

// 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度

// 注意是从第二个节点开始,第一个为源点

for(int i=2; i<=n; ++i)

{

    int tmp maxint;

    int v;

// 找出当前未使用的点jdist[j]最小值

    for(int j=1; j<=n; ++j)

        if((!s[j]) && dist[j]

        {

            j;              // u保存当前邻接点中距离最小的点的号码

            tmp dist[j];

        }

    s[u] 1;    // 表示u点已存入S集合中

 

// 更新dist

    for(int j=1; j<=n; ++j)

            if((!s[j]) && c[u][j]

            {

                int newdist dist[u] c[u][j];

                if(newdist dist[j])

                {

                    dist[j] newdist;

                    prev[j] u;

                }

            }

    }

}

原创粉丝点击