Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1. #!/bin/python3
  2.  
  3.  
  4. import sys
  5. points = []
  6. edges = []
  7. adj = {}
  8. n = int(input().strip())
  9. answer = [0 for _ in range (n+1)]
  10. for a0 in range(n-1):
  11. # An edge connects nodes 'u' and 'v':
  12. u, v = input().strip().split(' ')
  13. u, v = [int(u), int(v)]
  14. edges.append([u,v])
  15. if u not in adj:
  16. adj[u] = set()
  17. adj[u].add(v)
  18. else:
  19. adj[u].add(v)
  20. if v not in adj:
  21. adj[v] = set()
  22. adj[v].add(u)
  23. else:
  24. adj[v].add(u)
  25. for a0 in range(n):
  26. # Cartesian coordinate:
  27. x, y = input().strip().split(' ')
  28. x, y = [int(x), int(y)]
  29. points.append([x,y])
  30.  
  31.  
  32. def cp(base,a,b):
  33. q = (a[0]-base[0])*(b[1]-base[1]) - (a[1]-base[1])*(b[0]-base[0])
  34. return(q)
  35.  
  36.  
  37. #def convexhull(pts):
  38. # pts.sort()
  39. # if len(pts) <=1:
  40. # return(pts)
  41. # else:
  42. # U = []
  43. # L = []
  44. # for x in pts:
  45. # while len(L)>=2 and cp(L[-2],L[-1],x)<=0:
  46. # L.pop()
  47. # L.append(x)
  48. # for x in reversed(pts):
  49. # while len(U)>=2 and cp(U[-2],U[-1],x)<=0:
  50. # U.pop()
  51. ## U.append(x)
  52. # return(L[:-1]+U[:-1])
  53.  
  54.  
  55. def slope(a,b):
  56. if a[0] == b[0]:
  57. return(10**10)
  58. else:
  59. return((b[1]-a[1])/(b[0]-a[0]))
  60.  
  61.  
  62. #sort the points by slope with respect to the left bottom most point of convex hull
  63. def slopesort(pts):
  64. p = sorted(pts)
  65. x = p.pop(0)
  66. s = sorted(p,key=lambda y: slope(x,y))
  67. return(x,s)
  68.  
  69. children = {}
  70. current = [1]
  71. T = set()
  72. T.add(1)
  73. while current!=[]:
  74. x = current.pop()
  75. m = adj[x]-T
  76. current = current+list(m)
  77. children[x] = m
  78. T.add(x)
  79.  
  80. def subtree(k,child):
  81. current = [k]
  82. T = set()
  83. T.add(k)
  84. thischildren = {}
  85. thischildren[k] = child[k]
  86. while current!=[]:
  87. x = current.pop()
  88. m = child[x]-T
  89. current = current+list(m)
  90. thischildren[x] = m
  91. T.add(x)
  92. return(thischildren)
  93.  
  94. ccts = {}
  95. def cc(k):
  96. global ccts
  97. if k in ccts:
  98. return(ccts[k])
  99. if children[k] == set():
  100. ccts[k] = 0
  101. return(0)
  102. else:
  103. count = 0
  104. count += len(children[k])
  105. for i in children[k]:
  106. count+=cc(i)
  107. ccts[k] = count
  108. return(count)
  109.  
  110. cc(1)
  111.  
  112.  
  113.  
  114. def omfg(par,pts):
  115. #print(answer)
  116. ps = sorted(pts)
  117. x = par
  118. if len(ps) == 0:
  119. return
  120. if len(ps) == 1:
  121. answer[x] = ps[0]
  122.  
  123. else:
  124. this = slopesort(ps)
  125. answer[x] = this[0]
  126. remedges = this[1]
  127.  
  128. #print('remedges = ', remedges)
  129. t = list(children[x])
  130. arr=[]
  131. for i in t:
  132. arr.append(ccts[i])
  133. #print('arr is ', arr)
  134. if len(t) == 1:
  135. omfg(i,remedges)
  136. else:
  137. while arr!=[]:
  138. o = t.pop(0)
  139. i = arr.pop(0)
  140. omfg(o,remedges[:i+1])
  141. remedges = remedges[i+1:]
  142.  
  143.  
  144.  
  145.  
  146.  
  147. # if len(remedges) == 1:
  148. # a = list(children[x])[0]
  149. # answer[a] = remedges[0]
  150.  
  151. # else:
  152. # arr=[0]
  153. # l = list(cs[x])
  154. # for i in l:
  155. # arr.append(ccts[i]+arr[-1])
  156. # print('arr = ', arr)
  157. # for i in l:
  158. # m = l.index(i)
  159. # print('cut up arr', remedges[arr[m]:arr[m+1]])
  160. # omfg(i,subtree(i,children),remedges[arr[m]:arr[m+1]])
  161.  
  162.  
  163.  
  164.  
  165. omfg(1,points)
  166. #print(answer)
  167. for i in range(1,n+1):
  168. print(points.index(answer[i])+1,end=' ')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement