• Предмет: Информатика
  • Автор: mikelinalitvinova
  • Вопрос задан 4 месяца назад

100 БАЛЛОВ
Завдання.
1. Нерієнтований граф G(V,E) задано в табл.

2. Для заданого графа побудувати остовне дерево мінімальної вартості:

а) за допомогою алгоритму Прима;

б) за допомогою алгоритму Крускала.

3. Скласти схему алгоритму та написати програми, що реалізують ці алгоритми

(парні варіанти за списком – Прима, непарні варіанти - Крускала).

4. Написати процедуру обчислення вартості побудованого остовного дерева.

Приложения:

Ответы

Ответ дал: retwquu3
1

from heapq import heappop, heappush

class Graph:

   def __init__(self, vertices):

       self.V = vertices

       self.graph = [[] for _ in range(vertices)]

   def add_edge(self, u, v, weight):

       self.graph[u].append((v, weight))

       self.graph[v].append((u, weight))

   def prim_mst(self):

       visited = [False] * self.V

       min_heap = []

       start_vertex = 0

       visited[start_vertex] = True

       for neighbor, weight in self.graph[start_vertex]:

           heappush(min_heap, (weight, start_vertex, neighbor))

       mst = []

       while min_heap:

           weight, u, v = heappop(min_heap)

           if visited[v]:

               continue

           mst.append((u, v, weight))

           visited[v] = True

           for neighbor, weight in self.graph[v]:

               if not visited[neighbor]:

                   heappush(min_heap, (weight, v, neighbor))

       return mst

class Edge:

   def __init__(self, src, dest, weight):

       self.src = src

       self.dest = dest

       self.weight = weight

class Graph:

   def __init__(self, vertices):

       self.V = vertices

       self.graph = []

   def add_edge(self, src, dest, weight):

       self.graph.append(Edge(src, dest, weight))

   def kruskal_mst(self):

       def find(parent, i):

           if parent[i] == i:

               return i

           return find(parent, parent[i])

       def union(parent, rank, x, y):

           x_root = find(parent, x)

           y_root = find(parent, y)

           if rank[x_root] < rank[y_root]:

               parent[x_root] = y_root

           elif rank[x_root] > rank[y_root]:

               parent[y_root] = x_root

           else:

               parent[y_root] = x_root

               rank[x_root] += 1

       parent = []

       rank = []

       result = []

       for node in range(self.V):

           parent.append(node)

           rank.append(0)

       i = 0

       while len(result) < self.V - 1:

           u, v, w = self.graph[i]

           i += 1

           x = find(parent, u)

           y = find(parent, v)

           if x != y:

               result.append([u, v, w])

               union(parent, rank, x, y)

       return result

g = Graph(9)

g.add_edge(0, 1, 4)

g.add_edge(0, 7, 8)

g.add_edge(1, 2, 8)

g.add_edge(1, 7, 11)

g.add_edge(2, 3, 7)

g.add_edge(2, 8, 2)

g.add_edge(2, 5, 4)

g.add_edge(3, 4, 9)

g.add_edge(3, 5, 14)

g.add_edge(4, 5, 10)

g.add_edge(5, 6, 2)

g.add_edge(6, 7, 1)

g.add_edge(6, 8, 6)

g.add_edge(7, 8, 7)

mst_prim = g.prim_mst()

m


retwquu3: вот, полностью правельный
mikelinalitvinova: дуже дякую
Вас заинтересует