gmo61520

Untitled

Mar 12th, 2016
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.31 KB | None | 0 0
  1. # строим граф из входных данных
  2. def solve_graph(input_list):
  3. vertices_number = input_list[0][0]
  4. root_id = input_list[0][1]
  5. edges_number = vertices_number - 1
  6.  
  7. vertices = []
  8. for i in range(0, vertices_number):
  9. vertices.append({ 'id': i, 'left': None, 'right': None })
  10.  
  11. root_vertice = vertices[root_id]
  12.  
  13. edges = []
  14. for i in range(1, edges_number + 1):
  15. edges.append(input_list[i])
  16.  
  17. # распихаем потомков по слотам
  18. def arrange_children(vertice, vertice_parent_id):
  19. vertice_id = vertice['id']
  20.  
  21. # добавляем потомка в незанятый слот
  22. def add_child(vertice, child):
  23. if vertice['left'] == None:
  24. vertice['left'] = child
  25. else:
  26. vertice['right'] = child
  27.  
  28. for edge in edges:
  29. if edge[0] == vertice_id and edge[1] != vertice_parent_id:
  30. add_child(vertice, vertices[edge[1]])
  31. elif edge[1] == vertice_id and edge[0] != vertice_parent_id:
  32. add_child(vertice, vertices[edge[0]])
  33.  
  34. if vertice['left'] != None:
  35. arrange_children(vertice['left'], vertice_id)
  36. if vertice['right'] != None:
  37. arrange_children(vertice['right'], vertice_id)
  38.  
  39. arrange_children(root_vertice, -1)
  40. return root_vertice
  41.  
  42. # размер графа
  43. def calculate_width(vertice):
  44. if vertice == None: return 0
  45. return 1 + calculate_width(vertice['left']) + calculate_width(vertice['right'])
  46.  
  47. def calculate_height(vertice):
  48. if vertice == None: return 0
  49. return 1 + max(calculate_height(vertice['left']), calculate_height(vertice['right']))
  50.  
  51. def calculate_size(vertice):
  52. return calculate_width(vertice), calculate_height(vertice)
  53.  
  54. # рекурсивный расчёт координат вершин
  55. def calculate_positions(vertice, offset_x = 0, offset_y = -1):
  56. if vertice == None: return
  57.  
  58. # зачем-то ось Y направлена вверх, «против» графа, так что начнём отсчёт с
  59. # высоты и пойдём наверх
  60. if offset_y == -1: offset_y = calculate_height(vertice) - 1
  61.  
  62. vertice['x'] = offset_x + calculate_width(vertice['left'])
  63. vertice['y'] = offset_y
  64.  
  65. calculate_positions(vertice['left'], offset_x, offset_y - 1)
  66. calculate_positions(vertice['right'], vertice['x'] + 1, offset_y - 1)
  67.  
  68. # красивенький вывод
  69. def print_in_order(vertice):
  70. # если координаты ещё не были рассчитаны, рассчитаем
  71. if not 'x' in vertice: calculate_positions(vertice)
  72.  
  73. # размер графа
  74. height = calculate_height(vertice)
  75. width = calculate_width(vertice)
  76.  
  77. # создаём поле из «-1» размером с граф
  78. field = [ [ -1 for x in range(0, width) ] for x in
  79. list(range(0, calculate_height(vertice))) ]
  80.  
  81. # рекурсивно отмечаем вершину на поле
  82. def mark_vertice(vertice):
  83. if vertice == None: return
  84.  
  85. # опять же, переворачиваем ось Y
  86. field[height - 1 - vertice['y']][vertice['x']] = vertice['id']
  87. mark_vertice(vertice['left'])
  88. mark_vertice(vertice['right'])
  89.  
  90. mark_vertice(vertice)
  91.  
  92. # выводим поле (с пробелами вместо «-1»)
  93. print('\n'.join(''.join(
  94. ' ' if x == -1 else str(x) for x in y) for y in field))
  95.  
  96. # получаем координаты вершины
  97. def get_position_of(vertice, id):
  98. if vertice == None: return None
  99.  
  100. # если координаты ещё не были рассчитаны, рассчитаем
  101. if not 'x' in vertice: calculate_positions(vertice)
  102.  
  103. if vertice['id'] == id: return vertice['x'], vertice['y']
  104. return get_position_of(vertice['left'], id) or get_position_of(vertice['right'], id)
  105.  
  106. root_vertice = solve_graph([
  107. [ 10, 5, 3 ],
  108. [ 2, 4 ],
  109. [ 4, 1 ],
  110. [ 0, 6 ],
  111. [ 7, 6 ],
  112. [ 8, 9 ],
  113. [ 4, 5 ],
  114. [ 6, 3 ],
  115. [ 3, 5 ],
  116. [ 3, 8 ]
  117. ])
  118.  
  119. print_in_order(root_vertice)
  120. print(get_position_of(root_vertice, 1))
  121. print(get_position_of(root_vertice, 3))
  122. print(get_position_of(root_vertice, 9))
Advertisement
Add Comment
Please, Sign In to add comment