Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. def read_graph():
  2. with open('graph_input.txt', 'r') as input_graph:
  3. j = 0
  4. all_edges = {}
  5. for line in input_graph:
  6. j += 1
  7. from re import split
  8. edges = split('\),\(', line)
  9. max = 0
  10. for i in range(len(edges)):
  11. if i != 0:
  12. if max < int(edges[i][0]):
  13. max = int(edges[i][0])
  14. if max < int(edges[i][2]):
  15. max = int(edges[i][2])
  16. else:
  17. if max < int(edges[i][1]):
  18. max = int(edges[i][1])
  19. if max < int(edges[i][3]):
  20. max = int(edges[i][3])
  21. mas = [0] * max
  22. old = [0] * max
  23. for i in range(len(edges)):
  24. if i == 0:
  25. edges[i] = edges[i][1:]
  26. if i == len(edges):
  27. edges[i] = edges[i][0:2]
  28. if i == len(edges) - 1:
  29. if edges[i][len(edges[i]) - 1] == '\n':
  30. edges[i] = edges[i][:len(edges[i]) - 2]
  31. else:
  32. edges[i] = edges[i][:len(edges[i]) - 1]
  33. try:
  34. edge = eval(edges[i])
  35. if len(edge) != 3 or edge[0] <= 0 or edge[1] <= 0 or edge[2] <= 0:
  36. # print('Строка {}: введены неправильные параметры'.format(str(j)))
  37. exit()
  38. except:
  39. print('Строка {}: введены неправильные параметры'.format(str(j)))
  40. exit()
  41. if edge[0] not in all_edges:
  42. all_edges[edge[0]] = []
  43. for item in all_edges[edge[0]]:
  44. if item[1] == edge[1]:
  45. print('Строка {}: введены неправильные параметры, дуга в такую вершину уже существует'.format(
  46. str(j)))
  47. exit()
  48. if old[edge[1] - 1] + 1 != edge[2]:
  49. print('Строка {}: введены неправильные параметры'.format(str(j)))
  50. exit()
  51. mas[edge[0] - 1] += 1
  52. old[edge[1] - 1] = edge[2]
  53. all_edges[edge[0]].append([mas[edge[0] - 1], edge[1]])
  54.  
  55. if edge[1] not in all_edges:
  56. all_edges[edge[1]] = []
  57.  
  58. return all_edges
  59.  
  60.  
  61. def transform_graph(all_edges):
  62. transformed_graph = {}
  63. last_item = -1
  64. for item in sorted(all_edges.keys()):
  65. if last_item == -1:
  66. if item != 1:
  67. print('Введены неправильные параметры, первый номер вершины должен быть равен 1')
  68. exit()
  69. else:
  70. if item - last_item != 1:
  71. print('Введены неправильные параметры, разница между номерам вершин должна равняться 1')
  72. exit()
  73. last_item = item
  74. for vertex in sorted(all_edges.keys()):
  75. transformed_graph[vertex] = []
  76. sorted_edges = sorted(all_edges[vertex], key=lambda x: x[0])
  77. for i in range(len(sorted_edges)):
  78. if i == 0:
  79. if sorted_edges[i][0] != 1:
  80. print('Введены неправильные параметры, первый порядковый номер дуги должен быть равен 1')
  81. exit()
  82. else:
  83. transformed_graph[vertex].append(sorted_edges[i][1])
  84. else:
  85. if sorted_edges[i][0] - sorted_edges[i - 1][0] != 1:
  86. print('Введены неправильные параметры, разница между порядковыми номерам дуг должна равняться 1')
  87. exit()
  88. else:
  89. transformed_graph[vertex].append(sorted_edges[i][1])
  90. return transformed_graph
  91.  
  92.  
  93. def bfs(start, graph, d, p):
  94. d[start] = 0
  95. p[start] = start
  96. queue = [start]
  97. while len(queue):
  98. u = queue.pop(0)
  99. for v in graph[u]:
  100. if d[v] == 1e30:
  101. p[v] = u
  102. d[v] = d[u] + 1
  103. queue.append(v)
  104. return d, p
  105.  
  106.  
  107. def add_vertex(v, graph, visited, parts):
  108. visited[v] = True
  109. add_graph = {v: []}
  110. for vertex in graph[v]:
  111. if vertex not in visited:
  112. add_graph[v].append(add_vertex(vertex, graph, visited, parts))
  113. else:
  114. if vertex not in parts:
  115. add_graph[v].append({vertex: []})
  116. else:
  117. add_graph[v].append({vertex: parts[vertex]})
  118. parts[v] = add_graph[v]
  119. return add_graph
  120.  
  121.  
  122. def construct_graph(graph, d):
  123. constructed_graph = {}
  124. sorted_graph = dict(sorted(d.items(), key=lambda x: x[1]))
  125. parts = {}
  126. visited = {}
  127. for item in sorted_graph:
  128. if sorted_graph[item] == 0:
  129. add_vertex(item, graph, visited, parts)
  130. constructed_graph[item] = parts[item]
  131. else:
  132. break
  133. return constructed_graph
  134.  
  135.  
  136. def write_to_json(constructed_graph):
  137. import json
  138. with open('graph.json', 'w') as outfile:
  139. json.dump(constructed_graph, outfile, indent=3)
  140.  
  141.  
  142. if __name__ == '__main__':
  143. all_edges = read_graph()
  144. graph = transform_graph(all_edges)
  145.  
  146. d = {}
  147. p = {}
  148. for item in sorted(graph.keys()):
  149. d[item] = 1e30
  150. p[item] = -1
  151. for item in sorted(graph.keys()):
  152. if d[item] == 1e30:
  153. d, p = bfs(item, graph, d, p)
  154.  
  155. constructed_graph = construct_graph(graph, d)
  156. write_to_json(constructed_graph)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement