Algorytm Prims

Algorytm Prims

Minimalne drzewo rozpinające:

Wykres, który nie ma wskazówek, nazywa się niekierowanym wykresem. Każdy wykres musi mieć ścieżkę z jednego węzła do innego węzła. Drzewo rozpiętości to również niekierżawiony podłączony wykres, na którym wszystkie węzły wykresu są obecne z minimalnymi krawędziami. Jeśli drzewo spinka nie ma wszystkich węzłów wykresu, nie możemy powiedzieć, że jest to drzewo spinka. Całkowite ciężary drzewa spinka będą mniejsze niż oryginalna waga wykresu, ponieważ podłączyliśmy go przez minimalną wagę. Drzewo spinka również nie ma cyklu. Każdy wykres ma więcej niż jedno drzewo spinki, ale tylko jeden z nich będzie wyjątkowy. Nazywamy to minimalnym drzewem rozpinającym, ponieważ próbujemy utworzyć pełny wykres ze wszystkimi węzłami, jednocześnie utrzymując niską wagę.

Możemy narysować drzewo opinające za pomocą następujących dwóch metod:

  1. Algorytm Kruskala
  2. Algorytm Prim

W tym artykule omówimy algorytm Prim. Algorytm Kruskala zostanie omówiony w następnym artykule.

Algorytm Prim:

Algorytm Prim służy do znalezienia minimalnego drzewa rozpinającego wykresu. Algorytm Prim zaczyna się od dowolnego węzła, a następnie dodaje dowolny sąsiedni węzeł, którego waga jest minimalna, a proces ten trwa, aż wszystkie węzły na wykresach zostanie odwiedzone. Podczas tworzenia minimalnego drzewa rozpinającego wykresu musimy również nie tworzyć żadnych cykli, ponieważ cykle nie powinny znajdować.

Algorytm Prima:

Algorytm Prim stosuje zachłanne podejście do minimalnego drzewa rozpinającego. Musimy wybrać dowolny wierzchołek wykresu, a następnie wybrać następne wskaźniki przylegające, którego waga jest mniejsza, i kontynuujemy ten proces, aż nie podłączymy całych węzłów wykresu.

Krok 1: Wybierz dowolne źródło wierzchołki na wykresie.

Krok 2: Znajdź minimalną krawędź wagi, która jest przylegająca do źródła, a następnie podłącz ją do drzewa spinka.

Krok 3: Powtarzaj krok 2, aż wszystkie węzły nie zostaną dodane do minimalnego drzewa rozpinającego.

Przykład :

Poniżej jest przykład wyszukiwania minimalnego drzewa rozpinającego za pomocą algorytmu Prim.

1. Wybieramy dowolny losowy węzeł z wykresu G i dodajemy go do MST (minimalne drzewo rozpinające). Wybieramy tutaj węzeł 0.

2. Teraz wybieramy tę krawędź, która sąsiaduje z węzłem źródłowym (0), ale z najmniejszą wagą, a następnie dodajesz ten najmniejszy węzeł do minimalnego drzewa rozpinającego.

3. Teraz wybieramy tę krawędź, która sąsiaduje z węzłem źródłowym (0 lub 1), ale z najmniejszą wagą, a następnie dodajesz ten najmniejszy węzeł do minimalnego drzewa rozpinającego.

4. Teraz wybieramy tę krawędź, która sąsiaduje z węzłem źródłowym (0, 1 lub 3), ale z najmniejszą wagą, a następnie dodajesz ten najmniejszy węzeł do minimalnego drzewa rozpinającego.

5. Teraz wybieramy tę krawędź, która sąsiaduje z węzłem źródłowym (0, 1, 3 lub 4), ale z najmniejszą wagą, a następnie dodajemy ten najmniejszy węzeł do minimalnego drzewa rozpinającego się.

6. Teraz wybieramy tę krawędź, która sąsiaduje z węzłem źródłowym (0, 1, 3, 4 lub 6), ale z najmniejszą wagą, a następnie dodajemy ten najmniejszy węzeł do minimalnego drzewa rozpinającego.

7. Teraz wybieramy tę krawędź, która sąsiaduje z węzłem źródłowym (0, 1, 3, 4, 6 lub 2), ale z najmniejszą wagą, a następnie dodajemy ten najmniejszy węzeł do minimalnego drzewa rozpinającego.

Powyżej znajduje się nasze ostatnie mST (minimalne drzewo rozpinające), a całkowity koszt to 6.

Program MST C ++ Prim (minimalne drzewo spinka):

#włączać
#włączać
#włączać
#włączać
#włączać
typedef std :: para Sii;
typedef std :: wektor SSII;
int primsmst (int sourcenode, std :: vector i wykres)
// Ta kolejka będzie przechowywać szczegóły każdego węzła
// wraz z ich wartością wagową.
STD :: Priority_queue, STD :: Większy> k;
k.push (std :: Make_Pair (0, sourceNode));
Bool węzły [wykres.rozmiar()];
Memset (węzłowy, false, sizeof (bool)*wykres.rozmiar());
int mst_tree_cost = 0;
chwila (!k.pusty())
// wybieramy tutaj węzeł, który ma minimalny koszt
Sii itemnode;
itemnode = k.szczyt();
k.Muzyka pop();
int node = itemnode.drugi;
int cost = itemnode.Pierwszy;
// tutaj sprawdzamy, czy do MST nie został dodany jakikolwiek węzeł,
// następnie dodanie tego węzła.
Jeśli (!Nodesadded [węzeł])
mST_tree_cost += koszt;
węzłów [węzeł] = true;
// iteruj nad węzłami negibour, które zostały niedawno wzięte
// poza kolejką priorytetową.
// i dodano do MST, który nie został jeszcze dodany
dla (automatyczne i pary_node_cost: ghabet [węzeł])
int adencja_node = pary_node_cost.drugi;
if (nodesadded [ADINCY_NODE] == false)
k.push (pary_node_cost);




return MST_TREE_COST;

int main ()
// Szczegóły wykresu z węzłem kosztów i podania.
SSII zNode_0_in_GRAPH_1 = 1,1, 2,2, 1,3,
1,4, 2,5, 1,6;
SSII zNode_1_in_GRAPH_1 = 1,0, 2,2, 2,6;
SSII zNode_2_in_graph_1 = 2,0, 2,1, 1,3;
SSII zNode_3_in_GRAPH_1 = 1,0, 1,2, 2,4;
SSII zNode_4_in_GRAPH_1 = 1,0, 2,3, 2,5;
SSII zNode_5_in_graph_1 = 2,0, 2,4, 1,6;
SSII zNode_6_in_GRAPH_1 = 1,0, 2,2, 1,5;
int num_of_nodes = 7; // Węzły ogółem (0 do 6)
STD :: wektor Primsgraph;
Primsgraph.rozmiar (num_of_nodes);
primsgraph [0] = fromNode_0_in_GRAPH_1;
primsgraph [1] = fromNode_1_in_GRAPH_1;
primsgraph [2] = fromNode_2_in_GRAPH_1;
primsgraph [3] = fromNode_3_in_GRAPH_1;
primsgraph [4] = fromNode_4_in_GRAPH_1;
primsgraph [5] = fromNode_5_in_GRAPH_1;
primsgraph [6] = fromNode_6_in_GRAPH_1;
// Jak już wiemy, musimy wybrać źródłowy wierzchołek,
// Więc zaczynamy od węzła wierzchołkowego 0.
STD :: Cout << "Total cost of minimum spanning tree after Prim's algorithm : "
„” << PrimsMST(0, primsgraph) << std :: endl;
powrót 0;

Wyjście:

Całkowity koszt minimalnego drzewa rozpinającego po algorytmie Prim: 6

Złożoność czasu algorytmu Prim MST:

1. Całkowity czas wymagany do przetworzenia i wyboru węzła kolejki priorytetowej, który nie został jeszcze dodany do MST, to logv.Ale ponieważ działa na każdy wierzchołek, całkowita złożoność czasu wynosi V (logv).

2. Wykres jest niekierowany, a całkowite krawędzie będą wynosić 2e. Ponieważ musimy wepchnąć węzły do ​​kolejki priorytetowej, zajmie to całkowity dziennik czasu (v). Ponieważ jednak mamy w sumie 2e krawędzi, nasza całkowita operacja pchania będzie wynosi 2e (log (v)).

3. Całkowita złożoność po operacji 1 i 2 jest O ((e + v) log (v)).

Wniosek:

Badaliśmy minimalne drzewo rozpinające Prim, które jest pierwszą preferencją większości ludzi, gdy muszą znaleźć wykres MST z wykresu. Algorytm Prim jest łatwy do uchwycenia i wdrożenia w aplikacji w świecie rzeczywistym.Algorytm Prima jest bardzo przydatny w rzeczywistych aplikacjach, na przykład łączenie torów kolejowych z całymi miastami. To tylko jeden przykład, ale jego aplikacja jest ogromna, więc musimy zrozumieć ten algorytm.