Dijkstra算法:

解决带非负权重图的单元最短路径问题。时间复杂度为O(V*V+E)

算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短路径估计最小的节点u,对u的所有连边进行松弛操作。即对j=1~n,dis[j] = min(dis[j],dis[k]+map[k][j])。

常规代码如下:

void Dijkstra()
{
    int i,j,k,mini;
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++)
        d[i] = Mod;
    d[s] = 0;     //源点距离为0
    for(i=1;i<=n;i++)
    {
        mini = Mod;
        for(j=1;j<=n;j++)         //找最短路径估计最小的节点k
        {
            if(!vis[j] && d[j] < mini)
            {
                k = j;
                mini = d[j];
            }
        }
        vis[k] = 1; 
        for(j=1;j<=n;j++)       //松弛操作
        {
            if(mp[k][j] != Mod && d[j] > d[k] + mp[k][j])  //mp[k][j] != Mod 也可写成 !vis[j]
                d[j] = d[k] + mp[k][j];
        }
    }
}
View Code

相关文章:

  • 2021-11-02
  • 2022-01-01
  • 2021-11-10
  • 2022-12-23
  • 2021-05-09
  • 2022-01-31
  • 2021-10-07
  • 2021-07-01
猜你喜欢
  • 2022-12-23
  • 2022-02-01
  • 2021-06-23
  • 2021-11-29
  • 2021-05-27
  • 2021-12-17
相关资源
相似解决方案