Nelogeek

kruskal's algorithm python (new)

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