Модификация алгоритма Прима - PullRequest
0 голосов
/ 21 февраля 2019

G = (V, E) и A⊆E Мне было интересно узнать, как получить минимальное остовное дерево, если оно должно содержать все ребра в A (и при этом должно иметь минимальный вес), изменивАлгоритм Прима.

Может быть, кто-нибудь может дать мне несколько советов / идей о том, как эффективно изменить алгоритм?

1 Ответ

0 голосов
/ 22 февраля 2019

Использование ребер из A не позволит вам получить фактическое минимальное остовное дерево, если ребра в A не гарантированно принадлежат MST.

Однако, учитывая набор A, вы можетенайдите MST, который соединяет все остальные вершины с A.

. Вы не гарантируете, что ребра в A образуют один связанный компонент, поэтому я предполагаю, что они этого не делают.

В этом случае использование алгоритма Прима является плохой идеей, поскольку алгоритм Прима предполагает, что на каждом шаге вы добавляете грань между действительным MST и точкой, которой нет в MST.Поскольку «MST», образованный A, может быть несмежным, это нарушает допущения алгоритма Прима.

Вместо этого используйте алгоритм Крускала .Он добавляет ребра в «набор MST», рассматривая ребра в порядке их длины, всегда сначала выбирая самое короткое ребро.Если оба конца ребра уже находятся в наборе MST, то ребро отклоняется.Если в наборе MST только одно ребро, то новое ребро добавляется в множество MST.

Вы можете реализовать алгоритм следующим образом:

KRUSKAL(G,A):
  mst_set = ∅
  for each vertex v ∈ G.V:
    MAKE-SET(v)
  for each edge (u,v) in A:
    mst_set = mst_set ∪ {(u,v)}
    UNION(u,v)
  for each edge (u, v) in G.Edges ordered by weight(u, v), increasing:
    if FIND-SET(u) ≠ FIND-SET(v):
      mst_set = mst_set ∪ {(u, v)}
      UNION(u, v)
  return mst_set

где MAKE-SET,Операции UNION и FIND-SET являются частью структуры данных с непересекающимся набором.

...