首页 > 编程语言 >朴素的dijkstra最短路径算法

朴素的dijkstra最短路径算法

时间:2022-11-02 15:48:05浏览次数:41  
标签:node arr int 算法 最短 vis dijkstra pd 节点

dijkstra算法适用于无负权图中求最短路径,时间复杂度为O(n^2+e),n为节点数,e为边数

需要的数据:

1.n行两列数组arr[n][2],第一列记录当前节点到出发点的最短距离,第二列记录当前节点前面路过的节点
2.n长度的bool型数组pd[n],记录是否已经被选择过
3.vector类n行数组vis[n][],记录该行对应的节点到此行某列对应的下标的节点的距离

操作流程:

0.初始化:将图保存到vis中,pd数组元素初始值为1,表示可选,arr第一列除起点外全部初始化为无穷大,第二列可不初始化。

1.设当前节点it=起点

2.pd[it]赋值为0,表示已经经过此点不再经过,遍历vis[it],设当前遍历的节点为i,设v为经过it节点到i节点的最短距离,v=arr[0][it]+vis[it][i],即从起点到it节点的最短距离加上从it节点到i节点的距离,如果v<arr[0][i]则更新arr[0][i]为v,并更新arr[1][i]为it,表示经过it节点到i节点的距离更短.

3.同时遍历pd和arr[0],找出pd[i]==1且arr[0][i]值最小的节点i,当前节点it赋值为i.

4.重复2,3,直到pd中元素全部为0时返回arr[0][终点]即为起点到终点的最短路径。

证明

详见算法导论

难点

将图转化为二维vector数组。

 

伪代码:

#define maxn 8
struct node
{
    int v;
    int last_node;
    node()
    {
        v=last_node=0;
    }
    node(int a,int b):v(a),last_node(b){};
};
int arr[maxn][2];
bool pd[maxn]={1};
vector<node>vis[maxn];
int dijkstra(int start,int end)
{
    for(int i=0;i<maxn;i++)
    {
        arr[0][i]=10000;
    }
    arr[0][start]=0;
    while(1)
    {
        int it=-1;
        int minv=10000;
        for(int i=0;i<maxn;i++)
        {
            if(minv<arr[0][i]&&pd[i])
            {
                minv=arr[0][i];
                it=i;
            }
        }
        pd[it]=0;
        if(it==-1)
        {
            return arr[0][end];
        }
        int len=vis[it].size();
        for(int i=0;i<len;i++)
        {
            int v=vis[it][i].v+arr[0][it];
            if(v<arr[0][i])
            {
                arr[0][i]=v;
                arr[1][i]=it;
            }
        }
    }
}

 

标签:node,arr,int,算法,最短,vis,dijkstra,pd,节点
From: https://www.cnblogs.com/alineyyds/p/16851173.html

相关文章