BFS

1.PNG

  1. //BFS
  2. graph = {
  3. "A": ["B", "C"],
  4. "B": ["A", "C", "D"],
  5. "C": ["A", "B", "D", "E"],
  6. "D": ["B", "C", "E", "F"],
  7. "E": ["C", "D"],
  8. "F": ["D"]
  9. }
  10. def BFS(graph, s):
  11. queue = []
  12. queue.append(s)
  13. seen = set()
  14. seen.add(s)
  15. while (len(queue) > 0):
  16. vertex = queue.pop(0)
  17. nodes = graph[vertex]
  18. for w in nodes:
  19. if w not in seen:
  20. queue.append(w)
  21. seen.add(w)
  22. print(vertex)

111.png

DFS

  1. //DFS
  2. graph = {
  3. "A": ["B", "C"],
  4. "B": ["A", "C", "D"],
  5. "C": ["A", "B", "D", "E"],
  6. "D": ["B", "C", "E", "F"],
  7. "E": ["C", "D"],
  8. "F": ["D"]
  9. }
  10. def DFS(graph, s):
  11. stack = []
  12. stack.append(s)
  13. seen = set()
  14. seen.add(s)
  15. while (len(stack) > 0):
  16. vertex = stack.pop()
  17. nodes = graph[vertex]
  18. for w in nodes:
  19. if w not in seen:
  20. stack.append(w)
  21. seen.add(w)
  22. print(vertex)
  23. DFS(graph, "A")

111.png

最短路径

  1. graph = {
  2. "A": ["B", "C"],
  3. "B": ["A", "C", "D"],
  4. "C": ["A", "B", "D", "E"],
  5. "D": ["B", "C", "E", "F"],
  6. "E": ["C", "D"],
  7. "F": ["D"]
  8. }
  9. def BFS(graph, s):
  10. queue = []
  11. queue.append(s)
  12. seen = set()
  13. seen.add(s)
  14. parent = {s : None}
  15. while (len(queue) > 0):
  16. vertex = queue.pop(0)
  17. nodes = graph[vertex]
  18. for w in nodes:
  19. if w not in seen:
  20. queue.append(w)
  21. seen.add(w)
  22. parent[w] = vertex
  23. print(vertex)
  24. return parent
  25. parent = BFS(graph, "E")
  26. //打印出路径映射表
  27. for key in parent:
  28. print(key, parent[key])
  29. //如何从B走到E
  30. v = "B"
  31. while v != None:
  32. print(v)
  33. v = parent[v]

111.png

Dijkstra算法

  1. import heapq
  2. import math
  3. graph = {
  4. "A": {"B": 5, "C": 1},
  5. "B": {"A": 5, "C": 2, "D": 1},
  6. "C": {"A": 1, "B": 2, "D": 4, "E": 8},
  7. "D": {"B": 1, "C": 4, "E": 3, "F": 6},
  8. "E": {"C": 8, "D": 3},
  9. "F": {"D": 6},
  10. }
  11. def init_distance(graph, s):
  12. distance = {s: 0}
  13. for vertex in graph:
  14. if vertex != s:
  15. distance[vertex] = math.inf
  16. return distance
  17. def dijkstra(graph, s):
  18. pqueue = []
  19. heapq.heappush(pqueue, (0, s))
  20. seen = set()
  21. parent = {s : None}
  22. distance = init_distance(graph, s)
  23. while (len(pqueue) > 0):
  24. pair = heapq.heappop(pqueue)
  25. dist = pair[0]
  26. vertex = pair[1]
  27. seen.add(vertex)
  28. nodes = graph[vertex].keys()
  29. for w in nodes:
  30. if w not in seen:
  31. if dist + graph[vertex][w] < distance[w]:
  32. heapq.heappush(pqueue, (dist + graph[vertex][w], w))
  33. parent[w] = vertex
  34. distance[w] = dist + graph[vertex][w]
  35. parent[w] = vertex
  36. return parent, distance
  37. parent, distance = dijkstra(graph, "A")
  38. print(parent)
  39. print(distance)

111.png

参考:

https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.recommend_more_video.-1