dijkstra算法

2024-06-19 14:44:28 浏览数 (3)

用途

用来确定一个点到其他几个点的最近距离(不含负权的有向图)

算法思想

1.以各点到初始点的距离为最近距离(即直接与初始点相连的边的权),如果不直接相连的距离则为无穷。 2.选取这些边最短的,并判断该边的head与其他的点是否相连,如果相连之后的距离小于目前的最小距离,就更新初始点到各点的最小距离。(此时选出的最短的这条边的权就是他的head到初始点的最近距离,这时已经不需要判定该head距离初始点的最近距离,为其做上标记) 3.不断重复2操作知道所有的点都被标记,这是就选出了最近距离。

代码实现
代码语言:javascript复制
  int a,b;      //a代表的是节点数,b代表的是弧的数量
  int start;   //start代表的是初始位置
  int path[a][a];    //邻接矩阵
  int path2[a], p2[a];   //path2待选择的路径,已选择好的最短路径
    for(int i=0;i<a;i  )
    {
        for(int j=0;j<a;j  )
        {
            path[i][j]=10000;   //对对邻接矩阵进行初始化
        }
    }
    for(int i=0;i<a;i  )
    {
        p2[i]=10000;            //对最短路径进行初始化
    }

    string p[a];
    int a2,b2,length;
    for(int i=0;i<b;i  )
    {
        cin>>a2>>b2>>length;
        path[a2][b2]=length;
    }    //输入邻接矩阵的内容
    for(int i=0;i<a;i  )
    {
        path2[i]=path[start][i];   
    }
    for(int i=0;i<a-1;i  )     
    {
        int h=pd(path2,a);    //pd是自定义的一个找最小权边的函数
        if(h!=-1)           // h=-1说名path2中的未标记节点到初始点最近距离的值还是10000,即包括初始点在内的已标记节点与他们都无边相连,初始点无法到达他们,则循环无需进行下去
        {p2[h]=path2[h];
        path2[h]=0;
        for(int j=0;j<a;j  )
        {
            if((p2[h] path[h][j])<path2[j])
            {
                path2[j]=p2[h] path[h][j];
                p[j]=p[h];
                p[j].push_back(48 h);
            }
        }
        }
        else{
            break;
        }
    }

0 人点赞