Guest User

Untitled

a guest
Dec 17th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. def main():
  2. or_graph = {
  3. 'a': {'b'},
  4. 'b': {'c', 'd'},
  5. 'c': {'a'},
  6. 'd': {'e'},
  7. 'e': {'f'},
  8. 'f': {'d'},
  9. 'g': {'f', 'h'},
  10. 'h': {'i'},
  11. 'i': {'j'},
  12. 'j': {'g'},
  13. 'k': {'j'}
  14. }
  15. stack = dfs_returns_stack(or_graph)
  16. print(stack)
  17. strong_connected = dfs_revers(or_graph, stack)
  18. print(strong_connected)
  19.  
  20.  
  21. def dfs_returns_stack(or_graph):
  22. """
  23. Обход графа в грлубину.
  24. Возвращыет очередь компоненты связности в формате list.
  25. """
  26. stack = []
  27. used = set()
  28. for vertex in or_graph:
  29. if vertex not in used:
  30. dfs_comp_returns_stack(vertex, or_graph, used, stack)
  31. return stack
  32.  
  33.  
  34. def dfs_comp_returns_stack(vertex, graph, used, stack):
  35. """
  36. Обход компоненты свзяности в грлубину.
  37. Пополняет очередь stack вершинами компоненты связности.
  38. """
  39. used.add(vertex)
  40. for neighbor in graph[vertex]:
  41. if neighbor not in used:
  42. dfs_comp_returns_stack(neighbor, graph, used, stack)
  43. stack.append(vertex)
  44.  
  45.  
  46. def dfs_revers(or_graph, stack):
  47. """
  48. Обратный обход графа в глубину по стэку (stack).
  49. Возвращает list с множествами сильных компанент связности.
  50. """
  51. strong = []
  52. used = set()
  53. reversed_or_graph = revers_or_graph(or_graph)
  54. for i in range(len(stack) - 1, -1, -1):
  55. vertex = stack.pop()
  56. if vertex not in used:
  57. strong.append(dfs_returns_strong(vertex, reversed_or_graph,
  58. used))
  59. return strong
  60.  
  61.  
  62. def revers_or_graph(or_graph):
  63. """
  64. Возвращает обратный орграф.
  65. """
  66. reversed_or_graph = {}
  67. for vertex in or_graph:
  68. for new_vertex in or_graph[vertex]:
  69. if new_vertex not in reversed_or_graph:
  70. reversed_or_graph[new_vertex] = {vertex}
  71. else:
  72. reversed_or_graph[new_vertex].add(vertex)
  73. return reversed_or_graph
  74.  
  75.  
  76. def dfs_returns_strong(vertex, graph, used, strong=None):
  77. """
  78. Обход компоненты в грлубину.
  79. Возвращает сильную компаненту.
  80. """
  81. used.add(vertex)
  82. strong = strong or set()
  83. strong.add(vertex)
  84. if vertex not in graph:
  85. return strong
  86. for neighbor in graph[vertex]:
  87. if neighbor not in used:
  88. dfs_returns_strong(neighbor, graph, used, strong)
  89. return strong
  90.  
  91.  
  92. if __name__ == "__main__":
  93. main()
Add Comment
Please, Sign In to add comment