Advertisement
Guest User

Untitled

a guest
Aug 17th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. import math
  2. import sys
  3.  
  4. class Freckle:
  5.  
  6. def __init__(self, freckle_id, x_position, y_position):
  7. self.freckle_id = freckle_id
  8. self.x_position = x_position
  9. self.y_position = y_position
  10.  
  11.  
  12. class Edge(object):
  13.  
  14. def __init__(self, edge_id, start_freckle, to_freckle, weight):
  15. self.edge_id = edge_id
  16. self.start_freckle = start_freckle
  17. self.to_freckle = to_freckle
  18. self.weight = weight
  19. self.spanning_tree = False
  20.  
  21.  
  22.  
  23.  
  24.  
  25. def assign_weight(freckle_list, edge_list):
  26.  
  27. # for one in range(0, len(freckle_list)-1, 1):
  28. # for two in range(one+1, len(freckle_list)):
  29. # weight = euclidean_distance(freckle_list[one], freckle_list[two])
  30. # edge = Edge(freckle_list[two], euclidean_distance(freckle_list[one], freckle_list[two]))
  31. # freckle_list[one].edge_list.append(edge)
  32. edge_id = 0
  33. for one in range(0, len(freckle_list)-1):
  34. for two in range(1, len(freckle_list), 1):
  35. weight = euclidean_distance(freckle_list[one], freckle_list[two])
  36. if weight == 0:
  37. continue
  38. else:
  39. edge = Edge(edge_id, freckle_list[one], freckle_list[two], weight)
  40. edge_list.append(edge)
  41. edge_id +=1
  42.  
  43.  
  44. def euclidean_distance(edge_one, edge_two):
  45. distance = math.sqrt((edge_one.x_position-edge_two.x_position)**2 +(edge_one.y_position-edge_two.y_position)**2)
  46. return distance
  47.  
  48.  
  49. def kruskal(answer_list, freckle_list, freckle_num):
  50. edge_list = list()
  51. assign_weight(freckle_list, edge_list)
  52. union_find = UnionFind(len(edge_list))
  53. mst_tree = list()
  54. edge_list.sort(key=lambda one_edge: one_edge.weight)
  55. for edge in edge_list:
  56. if not edge.spanning_tree:
  57. if union_find.find_set(edge.start_freckle.freckle_id) != union_find.find_set(edge.to_freckle.freckle_id):
  58. mst_tree.append(edge)
  59. if len(mst_tree) == freckle_num - 1:
  60. edge.spanning_tree = True
  61. union_find.merge_set(edge.start_freckle.freckle_id, edge.to_freckle.freckle_id)
  62. edge_list.sort(key=lambda one_edge: one_edge.weight)
  63. else:
  64. return
  65. total = 0
  66. for x in mst_tree:
  67. total += x.weight
  68.  
  69. answer_list.append(round(total, 2))
  70.  
  71.  
  72.  
  73. class UnionFind:
  74.  
  75. def __init__(self, freckle_num):
  76. self.parent = None
  77. self.create_set(freckle_num)
  78.  
  79. def create_set(self, freckle_num):
  80. self.parent = list(range(freckle_num))
  81. ## parent[0] = 0, parent[1]=1 ...
  82.  
  83. def find_set(self, freckle_num):
  84. if self.parent[freckle_num] != freckle_num:
  85. self.parent[freckle_num] = self.find_set(self.parent[freckle_num])
  86. return self.parent[freckle_num]
  87.  
  88. ##who is the parent of freckle number 3? , then it should return which is the root
  89.  
  90. def merge_set(self, one_freckle, two_freckle):
  91. self.parent[self.find_set(one_freckle)] = self.find_set(two_freckle)
  92.  
  93. ##merge it. For example... parent[0] = 0, 1
  94.  
  95. def main():
  96. answer_list = list()
  97.  
  98. freckle_list = list()
  99. case_num = sys.stdin.readline()
  100. case_num = int(case_num)
  101.  
  102. for num in range(0, case_num):
  103. freckle_list = list()
  104. skip_blank = sys.stdin.readline()
  105. freckle_num = int(sys.stdin.readline())
  106. for one_freckle in range(0, freckle_num):
  107. positions = sys.stdin.readline()
  108. positions = positions.rstrip('n')
  109. positions = positions.split(" ")
  110. x_position = float(positions[0])
  111. y_position = float(positions[1])
  112. freckle = Freckle(one_freckle, x_position, y_position)
  113. freckle_list.append(freckle)
  114. # if num == 0:
  115. # sys.stdout.write("n")
  116. kruskal(answer_list, freckle_list, freckle_num)
  117. count = 0
  118. for answer in answer_list:
  119. #sys.stdout.write(str(answer))
  120. print(answer)
  121. if count < len(answer_list)-1:
  122. print()
  123. count +=1
  124.  
  125.  
  126. if __name__ == "__main__":
  127. main()
  128.  
  129. 3
  130.  
  131. 5
  132. 1.0 1.0
  133. 3.0 1.0
  134. 1.0 3.0
  135. 5.0 4.0
  136. 7.0 7.0
  137.  
  138. 4
  139. 1.0 1.0
  140. -1.0 1.0
  141. -1.0 -1.0
  142. 1.0 -1.0
  143.  
  144. 6
  145. 3.0 3.0
  146. 5.0 -2.0
  147. 8.0 4.0
  148. 12.5 -3.0
  149. -5.0 -1.0
  150. 0.0 0.0
  151.  
  152. 11.21
  153.  
  154. 6.00
  155.  
  156. 27.39
  157. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement