Advertisement
Guest User

Untitled

a guest
May 26th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.34 KB | None | 0 0
  1. #n = 10 # liczba wierzchołków w grafie n e C
  2.  
  3. #graf = #zadany w dowolnie wybrany sposób graf
  4.  
  5. #color = [True, True, True, True, True, False, False, False, False, False]
  6.  
  7. #matching = [0 for i in enumerate(range(len(color)))]
  8.  
  9.  
  10. from collections import defaultdict
  11.  
  12.  
  13. class Graph:
  14.  
  15. def __init__(self, vertices):
  16. self.V = vertices # liczba wierzchołków
  17. self.graph = defaultdict(list) # słownik do przechowywania wykresu
  18. self.gender = [None for i in enumerate(range(self.V))] #tablica zawierajaca informację o płci, Tru-mężczyzna, Fal - Kobieta, Domyślnie - none
  19.  
  20. self.matching = [-1 for i in enumerate(range(self.V))]
  21.  
  22. self.Q = []
  23. self.visited = [None for i in enumerate(range(self.V))] #tablica zawierajaca informację o płci, Tru-mężczyzna, Fal - Kobieta, Domyślnie - none
  24. self.augment = [0 for i in enumerate(range(self.V))] #tablica zawierajaca informację o płci, Tru-mężczyzna, Fal - Kobieta, Domyślnie - none
  25. self.v = int
  26. self.x = int
  27. self.y = int
  28.  
  29. def add_edge(self, u, v): #funkcja dodawania krawędzi
  30. self.graph[u].append(v)
  31. self.graph[v].append(u)
  32.  
  33. def rmv_edge(self, u, v): # funkcja usuwa krwedź u-v z wykresu
  34. for index, key in enumerate(self.graph[u]):
  35. if key == v:
  36. self.graph[u].pop(index)
  37. for index, key in enumerate(self.graph[v]):
  38. if key == u:
  39. self.graph[v].pop(index)
  40.  
  41. def insert_gender(self, u, g):
  42. self.gender[u] = g
  43.  
  44. #def matching_test(self):
  45. #asd = 1
  46.  
  47. def matching_AHA(self):
  48. for i in range(self.V): #k05
  49. #print("HURA")
  50. if self.matching[i] == -1 and self.gender[i] is False: #k05
  51. #print("ELO")
  52.  
  53. self.visited = [False for vertex in enumerate(range(self.V))]
  54. self.Q.clear()
  55.  
  56. self.visited[i] = True
  57. self.augment[i] = -1
  58. self.Q.append(i)
  59. print(self.Q)
  60.  
  61. while not len(self.Q) == 0 : #k09
  62.  
  63.  
  64. self.x = self.Q.pop() #k10
  65. print(self.x)
  66. print("elo")
  67. print(self.gender[5])
  68. print("przebieg whilenot")
  69. if self.gender[self.x] is True: #K11
  70.  
  71. if self.matching[self.x] == -1: #K12
  72.  
  73. while self.augment[self.x] > -1: #K13
  74.  
  75. if self.gender[self.x] is True: #K14
  76.  
  77. self.matching[self.x] = self.augment[self.x] #K15
  78. self.matching[self.augment[self.x]] = self.x
  79.  
  80. self.x = self.augment[self.x] #K16
  81. break
  82. else:
  83. self.augment[self.matching[self.x]] = self.x
  84. self.visited[self.matching[self.x]] = True
  85. self.Q.append(self.matching[self.x])
  86.  
  87. else:
  88. self.p = self.graph
  89.  
  90. self.y = self.p[self.x]
  91. print(self.p)
  92. print(self.y)
  93. print("FASFAS")
  94. print(self.visited)
  95. #print(self.visited[self.y])
  96. for blablazmienna in range(len(self.y)):
  97. print(blablazmienna)
  98. print(self.visited)
  99. print("stop1")
  100. print(self.y)
  101. print(self.visited[self.y[blablazmienna]])
  102. if not self.visited[self.y[blablazmienna]]:
  103. self.visited[self.y[blablazmienna]] = True
  104. self.augment[self.y[blablazmienna]] = self.x
  105. self.Q.append(self.y[blablazmienna])
  106. print("DZIALA?")
  107. print(self.matching)
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117. """
  118. # funkcja oparta na dfs do liczenia osiągalnych wierzchołków od v (zwraca liczbę)
  119. def DFSCount(self, v, visited):
  120. count = 1
  121. visited[v] = True
  122. for i in self.graph[v]:
  123. if visited[i] == False:
  124. count = count + self.DFSCount(i, visited)
  125. return count
  126.  
  127. # funkcja sprawdzający czy krwaędź u-v można uznać za następną krawędź
  128. # Euler Tour
  129. def isValidNextEdge(self, u, v):
  130. # krawedź u-v jest dostęna w jednym z dwóch przypadków
  131.  
  132. # 1) Jeżeli v jest jedynym sąsiadującem wierzchołkiem u
  133. if len(self.graph[u]) == 1:
  134. return True
  135. else:
  136.  
  137. # 2) Jeżeli jest więcej sąsiadów, sprawdza się ilość połączeń które zostaną po usunięciu krawędzi u-v
  138.  
  139. #2.a) liczymy wierzchołki osiągalne z u
  140. visited = [False] * (self.V)
  141. count1 = self.DFSCount(u, visited)
  142.  
  143. #2.b) usuwamy krawędź (u, b), po usunięciu krawędzi sprawdzamy wierzchołki osiągalne z u
  144. self.rmvEdge(u, v)
  145. visited = [False] * (self.V)
  146. count2 = self.DFSCount(u, visited)
  147.  
  148. # 2.c) dodajemy krawędź spowrotem do grafu
  149. self.addEdge(u, v)
  150.  
  151. # 2.d) Jeżeli wartość count1 jest większa, to krawędź (u, v) jest mostem (zwracamy fałsz, o ile oczywiście wcześniej nie zostało uznane, że jest to ostatnia krawędź)
  152. #print(count1)
  153. #print(count2)
  154. #print(" ")
  155. return False if count1 > count2 else True
  156.  
  157. # pokaz trase eulera zaczynajac od wierzchołka u
  158. def printEulerUtil(self, u):
  159. # powtóz dla wszystkich wierzchołków sąsiadujących z tym wierzchołkiem
  160. for v in self.graph[u]:
  161. # If edge u-v is not removed and it's a a valid next edge
  162. if self.isValidNextEdge(u, v):
  163. print("%d-%d " % (u, v)),
  164. self.rmvEdge(u, v)
  165. self.printEulerUtil(v)
  166.  
  167. def printEulerTour(self):
  168. # Find a vertex with odd degree
  169. u = 0
  170. for i in range(self.V):
  171. #print(i)
  172. if len(self.graph[i]) % 2 != 0:
  173. u = i
  174. break
  175. # Print tour starting from odd vertex
  176. #print(u)
  177. self.printEulerUtil(u)
  178. """
  179.  
  180. #print("Graf")
  181. g1 = Graph(10)
  182.  
  183. g1.insert_gender(0, True)
  184. g1.insert_gender(1, True)
  185. g1.insert_gender(2, True)
  186. g1.insert_gender(3, True)
  187. g1.insert_gender(4, True)
  188. g1.insert_gender(5, False)
  189. g1.insert_gender(6, False)
  190. g1.insert_gender(7, False)
  191. g1.insert_gender(8, False)
  192. g1.insert_gender(9, False)
  193.  
  194.  
  195. g1.add_edge(0, 7)
  196. g1.add_edge(0, 8)
  197.  
  198. g1.add_edge(1, 5)
  199. g1.add_edge(1, 6)
  200. g1.add_edge(1, 8)
  201.  
  202. g1.add_edge(2, 5)
  203.  
  204. g1.add_edge(3, 6)
  205. g1.add_edge(3, 8)
  206. g1.add_edge(3, 9)
  207.  
  208. g1.add_edge(4, 7)
  209. g1.add_edge(4, 8)
  210.  
  211. #g1.matching_test()
  212. g1.matching_AHA()
  213.  
  214.  
  215. #g1.printEulerTour()
  216.  
  217. #print("Graf 2 (tablica)")
  218.  
  219. #g2 = Graph(5)
  220. #g2.addEdge(0, 1)
  221. #g2.addEdge(0, 2)
  222. #g2.addEdge(1, 2)
  223. #g2.addEdge(1, 4)
  224. #g2.addEdge(1, 3)
  225. #g2.addEdge(3, 4)
  226.  
  227. #g2.printEulerTour()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement