Nelogeek

kruskal's algorithm python

Oct 28th, 2021
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.11 KB | None | 0 0
  1. class Graph:
  2.     def __init__(self, vertex):
  3.         self.V = vertex
  4.         self.graph = []
  5.  
  6.     def add_edge(self, u, v, w):
  7.         self.graph.append([u, v, w])
  8.  
  9.  
  10.     def search(self, parent, i):
  11.         if parent[i] == i:
  12.             return i
  13.         return self.search(parent, parent[i])
  14.  
  15.     def apply_union(self, parent, rank, x, y):
  16.         xr = self.search(parent, x)
  17.         yr = self.search(parent, y)
  18.         if rank[xr] < rank[yr]:
  19.             parent[xr] = yr
  20.         elif rank[xr] > rank[yr]:
  21.             parent[yr] = xr
  22.         else:
  23.             parent[yr] = xr
  24.             rank[xr] += 1
  25.  
  26.     def triangle_matrix(self, matrix):
  27.         pass
  28.  
  29.     def kruskal(self, vertex, matrix):
  30.        
  31.        
  32.         result = []
  33.         i, e = 0, 0
  34.        
  35.         #Сортирую рёбра в порядке возрастания их веса
  36.         self.graph = sorted(self.graph, key=lambda item: item[2])
  37.         parent = []
  38.         rank = []
  39.        
  40.         #Выбераю край, имеющий минимальный вес, и
  41.         #добавляю его к самому большому. Если ребро создает
  42.         #цикл - идём к следующему
  43.         for node in range(self.V):
  44.             parent.append(node)
  45.             rank.append(0)
  46.         while e < self.V - 1:
  47.             u, v, w = self.graph[i]
  48.             i = i + 1
  49.             x = self.search(parent, u)
  50.             y = self.search(parent, v)
  51.             if x != y:
  52.                 e = e + 1
  53.                 result.append([u, v, w])
  54.                 self.apply_union(parent, rank, x, y)
  55.                
  56.         #переворачиваю результат, чтобы забить его в нижний треугольник матрицы
  57.         for k in range(len(result)):
  58.             result.append([result[k][1], result[k][0], result[k][2]])
  59.         #print(result)
  60.  
  61.         #Нулевая матрица вывода
  62.         arr = []
  63.         for i in range(vertex):
  64.             arr.append([0]*vertex)
  65.            
  66.         #Создание матрицы весов
  67.         for k in result:
  68.             arr[k[0]][k[1]] = k[2]
  69.  
  70.         #Вывод матрицы весов
  71.         #print()
  72.         print(f"   1  2  3  4  5")
  73.         count = 1
  74.         sum_ostov = 0
  75.         for i in arr:
  76.             print(count, i)
  77.             count += 1
  78.             for j in i:
  79.                 sum_ostov += j
  80.         print(f"\nВеличина минимального остова: {int(sum_ostov/2)}")
  81.  
  82.  
  83. matrix = [
  84.     #  1   2   3   4   5
  85.     [  0,  0,  0,  1,  3],# 1
  86.     [  0,  0,  3,  5,  4],# 2
  87.     [  0,  3,  0,  0,  4],# 3
  88.     [  1,  5,  0,  0,  2],# 4
  89.     [  3,  4,  4,  2,  0],# 5
  90.     ]
  91.  
  92.  
  93. vertex = len(matrix)
  94.  
  95. g = Graph(vertex)
  96.  
  97. graph = []
  98. triangle_index = 0
  99. for i in range(vertex):
  100.     for j in range(triangle_index, vertex):
  101.         if matrix[i][j] != 0:
  102.             graph.append( [i+1, j+1, matrix[i][j]] )
  103.     triangle_index += 1
  104.  
  105.  
  106. #print(graph)
  107.  
  108. for u, v, w in graph:
  109.     g.add_edge(u-1, v-1, w)
  110.    
  111.  
  112. g.kruskal(vertex, matrix)
  113.  
Advertisement
Add Comment
Please, Sign In to add comment