【数据结构】图论基础

待完善。。。

目录

 

图的遍历

最小代价生成树(无向图)

最短路径(有向图)


  • 图的遍历

    • DFS图的深度优先搜索遍历
      • 基本思想:
        • 1⃣️首先访问出发点v,并将其标记为访问过
        • 2⃣️然后选取与v邻接的没有访问过的任意一个顶点w,并访问它
        • 3⃣️再选取与w邻接的没访问过的顶点访问,重复上述动作,直到所有顶点被访问过。
      • PS:
        • 需要一个visit[]数组,用来作为顶点的访问标记

           

    • BFS图的广度优先搜索遍历
      • 基本思想:
        • 1⃣️首先访问起始顶点v
        • 2⃣️然后选取与v邻接的全部顶点w1 w2 ... wn 进行访问
        • 3⃣️再依次访问与w1 w2 ... wn邻接的全部顶点,重复动作,直到所有顶点被访问过。
      • PS:
        • 需要一个队列,用来存放顶点的全部未被访问过的邻接顶点p = p -> nextarc;(邻接表)
        • 队列为空的时候跳出循环

           

  • 最小代价生成树(无向图)

    • 普里姆算法Prim
      • 算法思想
        • 1⃣️任意取出一个顶点,把它当成一棵树,
        • 2⃣️然后从与这棵树邻接的边中挑一条最短的边,并将这条边所连接的顶点加入这棵树
        • 3⃣️然后再找一条与这棵树邻接的一条最短的边,重复上述动作,直至所有顶点加入树中
      • 算法执行过程中的关键理解点
        • 两个数组,vset[]和lowcost[],vset[i]]=1表示顶点i已经加入树中。lowcost[i]保存当前生成树到顶点i的最短一条边的权值
      • 复杂度分析
        • n^2
        • 适用于稠密图。无向图。
    • 克鲁斯卡尔Kruskal
      • 算法思想
        • 1⃣️用每次找出候选边权值最小的边,并入生成树中
        • 2⃣️重复上述动作,直至所有边都检测完毕。
      • 算法执行过程中的关键理解点
        • 图中所有边按照权值大小排序sort()
        • 🌟从最小的边开始扫描,检测是否为候选边(该边加入不会形成回路),是,并入。
        • 关于回路问题【并查集】,一棵或者几颗树,找妈妈(root节点)妈妈一样就是一家子(一个集合)。
      • 复杂度分析
        • 取决于排序算法的复杂度。规模由图的边数e决定
        • 适用于稀疏图。无向图。
  • 最短路径(有向图)

    • 迪杰斯特拉算法Dijkstra
      • 求图中某顶点到其余顶点的最短路径
      • 算法思想
        • 设两个集合S,T。S存放已经找到的最短路径的顶点,T存放剩余顶点。
        • 找v0到集合T中的所有顶点路径最短的点Vu加入S中。
        • 🌟每并入一个顶点,都要更新v0到T集合中剩余顶点的最短路径长度。
        • 不断重复上述动作,直至所有节点并入S中。
      • 执行过程
        • 引入3个数组,dist[],path[]和set[]数组。
        • dist[]:当前已经找到的v0:奥vi的最短路径的长度。初态:有边就是边的权值,无边dist[vi] = ∞
        • Path[]:保存从v0到vi最短路径的前一个顶点。初态为:v0到vi有边,path[vi] = v0,否则path[vi] = -1 。本体就是-1。path保存的是一棵树,一颗双亲存储结构存储的树。借助栈,可以直接输出叶子到根路径上的节点。
        • Set[]:标记数组,set[vi] = 0 表示vi在T中,未并入S。初态:set[vo] = 1,其余全为0 。
      • 复杂度
        • n^2
    • 弗洛伊德算法Floyd
      • 求任意一对顶点间的最短路径
      • 算法思想
      • 执行过程
      • 复杂度
        • n^3

    mindmap

  • mindmap

     

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值