常考知识点之Dijkstra算法讲解

举报
Linux猿 发表于 2021/11/25 22:49:39 2021/11/25
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


DijkstraDijkstra广Dijkstra

   

 1

Dijkstra

V0DijkstraV0

nV0g[][]V0ViD[i]g[0][i]:D[i] = g[0][i]

SV0V0S={v0}

1V0VkVkS使

D[i]V0VkVkV0V0,....,VkV0Vk0

2VkSS={V0,......,Vk}

3使VkV0VkV0使Vk

    D[k] + g[k][j] < D[j] VjSVjV0D[j]VkD[j]D[k]V0,Vkg[k][j]VkVjD[k]+g[k][j](V0,Vj)

   D[j]

D[j]

   

41

n-1n-1S

S

bool visited[Max_Size]; //标记顶点是否已经加入到集合S中

void Dijkstra(MGrap G, int v0, MinPath& D)

{

    for(int v = 0; v < G.vexnum; v++) //初始化所有顶点到源点的距离

    {

        visited[v] = false;

        D[v] = G.g[v0][v];

    }

D[v0] = 0; visited[v0] = true;// 设置源点

// 遍历n - 1次,求源点到其余n-1个顶点的最短距离

for(int i = 1; i < G.vexnum; ++i) 

{

        min = Max_Path; //设置一个无穷大的距离,以便寻找最近顶点

   //for循环选出不在集合S中,且距离V0最近的一个顶点


        for(int v = 0; v < G.vexnum; ++v)

            if(!visited[v] && D[v] < min)

            {

                k = v; min = D[v];

            }

        visited[k] = true;  //将选入的顶点标记,相当于放入集合S中

  //使用选入的顶点作为中间结点,对其它未选入的顶点到源点的距离进行更新

        for(int j = 0; j < G.vexnum; ++j)  

            if(!visited[j] && min + g[k][j] < D[j])

            {

                D[j] = min + g[k][j];

            }

    }

}

forforO(n)forO(n)forO(n2)

使O(n2)

DijkstraDijkstraDijkstra


CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。