当前位置:   article > 正文

数据结构(图,树)

数据结构(图,树)

前序知识:

(1)并查集

并查集(畅通工程)_畅通工程并查集-CSDN博客

Note:         

1.find 目的找到元素的老大 (链表遍历逐层向上找)

2.merge 合并集合(实质改变集合老大,链表性质)

树:

最小生成树:

求最小路径和(Kruskal算法):

(1)再畅通工程(最小生成树)-CSDN博客(空白图)

Note:         先排序结点距离,从小到大利用并查集找结点老大,取较小序号结点作为两结点老大

  1. function KruskalMST(Graph):
  2. # 初始化化并查集(老大设为自己)
  3. # 边按权重从小到大排序
  4. 从小到大利用并查集找结点老大,取较小序号结点作为两结点老大
  5. for each edge in Graph.edges:
  6. 如果属于同一个集合,跳过这条边(添加这条边会形成环)。
  7. if ds.find_set(edge.node1) != ds.find_set(edge.node2):
  8. MST.append(edge)
  9. ds.union(edge.node1, edge.node2)
  10. 如果最小生成树中的边数等于节点数减一,则停止添加边。
  11. if length(MST) == length(Graph.nodes) - 1:
  12. break
  13. return MST

(2)继续畅通工程(最小生成树+并查集)-CSDN博客(有部分边存在)

Note:        一旦路径已建好,将其长度值赋值为0,然后所有路径一致看待

  1. function KruskalMST(Graph):
  2. # 初始化化并查集(老大设为自己)
  3. # 输出结点距离,判断是否存在,若存在,距离赋值为0
  4. # 边按权重从小到大排序
  5. 从小到大利用并查集找结点老大,取较小序号结点作为两结点老大
  6. for each edge in Graph.edges:
  7. 如果属于同一个集合,跳过这条边(添加这条边会形成环)。
  8. if ds.find_set(edge.node1) != ds.find_set(edge.node2):
  9. MST.append(edge)
  10. ds.union(edge.node1, edge.node2)
  11. 如果最小生成树中的边数等于节点数减一,则停止添加边。
  12. if length(MST) == length(Graph.nodes) - 1:
  13. break
  14. return MST

(3)问题 Q: 小希的迷宫(并查集+最小生成树)-CSDN博客(知所有边,判断是否成环,同老大)

Note:        给出相应图路径,

  1. function init(n):
  2. for i = 1 to n:
  3. parent[i] = i # 每个节点的父节点初始化为自己
  4. # 判断是否同集合的数据再次出现,否则dec=0输出No
  5. rootX = find(x),rootY = find(y)
  6. if rootX != rootY:
  7. if rank[rootX] > rank[rootY]:
  8. parent[rootY] = rootX
  9. elif rank[rootX] < rank[rootY]:
  10. parent[rootX] = rootY
  11. else:
  12. dec=0
  13. # 判断所有结点老大是否相同,否则输出No
  14. for i = 1 to n:
  15. if dec1 ==1:
  16. if find(i) != i
  17. unique_leader=find(i)
  18. dec1=0;
  19. else:
  20. if find(i) != unique_leader:
  21. dec=0

图:

最短路径:

(1)最短路径—Dijkstra算法及 变式题(一个人的旅行)-CSDN博客

 Note:       不断运行广度优先算法找可见点,计算并更新可见点到源点的最短距离长度

  1. function dijkstra(Graph, source):
  2. dist[] =for all vertices
  3. prev[] = undefined for all vertices
  4. dist[source] = 0
  5. priority_queue = new MinHeap()
  6. priority_queue.insert(source, 0)
  7. while not priority_queue.isEmpty():
  8. u = priority_queue.extractMin()
  9. for each neighbor v of u:
  10. alt = dist[u] + weight(u, v)
  11. if alt < dist[v]:
  12. dist[v] = alt
  13. prev[v] = u
  14. priority_queue.decreaseKey(v, alt)
  15. return dist, prev

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/430130
推荐阅读
相关标签
  

闽ICP备14008679号