Prims Algoritması C Kodu

prims algoritması
Prims Algoritması

Prims algoritması c kodu yapısına buradan ulaşabilirsiniz. Kodun neredeyse her satırına yorum satırı eklenmiştir.

Yazılım içerisinde;

Prims MinKey Fonksiyonu : En kısa yolu hesaplar

Prims primMST Fonksiyonu: MinKey fonksiyonu kullanılarak Prims Asgari tarama ağacı oluşturulur.

bunların dışında yardımcı fonksiyonlar bulunmaktadır.

Prims Algoritması C Kodu



#include <stdio.h>

#include <limits.h>
#include <stdbool.h>



// Ağaç yapısındaki boyutu belirtiyorum

#define V 5



// En kısa yolu bulan fonksiyon, eğer daha kısa yol varsa güncelleme yapıyor.

int minKey(int key[], bool mstSet[])

{

   // min değişkenine sonsuz değeri atandı.

   int min = INT_MAX, min_index;



   for (int v = 0; v < V; v++)

     if (mstSet[v] == false && key[v] < min)

         min = key[v], min_index = v;



   return min_index;

}



// Asgari tarama ağacını ekrana bastıran fonksiyon

int printMST(int parent[], int n, int graph[V][V])

{

   printf("Edge   Weight\n");

   for (int i = 1; i < V; i++)

      printf("%d - %d    %d \n", parent[i], i, graph[i][parent[i]]);

}



// MST yapısını create eden fonksiyon. Bu fonksiyona gönderilen graf parametresi sayesinde ağaç MST oluşturulur

void primMST(int graph[V][V])

{

     int parent[V]; // yapılandırılmış MST'yi tutan değişken

     int key[V];   // En az maliyeti tutan dizi

     bool mstSet[V];  // bir düğümün ziyaret edilip edilmediğini kontrol eder



     // Başlangıçta tüm düğümlerin maliyeti sonsuz kabul edilir.

     for (int i = 0; i < V; i++)

        key[i] = INT_MAX, mstSet[i] = false;



     // Her zaman ilk vertex MST'ye dahil edilir.

     key[0] = 0;     // ilk düğümün maliyeti 0 kabul edilir

     parent[0] = -1; // prims algoritmasında ilk düğüm her zaman kök düğümdür



     // For döngüsüyle tüm düğümleri en kısa maliyetle gezmeyi hedefliyoruz

     for (int count = 0; count < V-1; count++)

     {

        // key değerine en yakın maliyetli düğümü u değişkenine atıyoruz.

        int u = minKey(key, mstSet);



        // u indisini ziyaret edildi kabul ediyoruz

        mstSet[u] = true;



        // Burada key değişkenini ve parent değişkenini güncelliyoruz

        for (int v = 0; v < V; v++)



           // graph[u][v] noktası eğer 1 ise ve

           // mstSet[v] değeri false ise ve

           // graph[u][v] değeri key[v] değerinden küçükse parent ve key değerlerini güncelliyoruz.

          if (graph[u][v] && mstSet[v] == false && graph[u][v] <  key[v])

             parent[v]  = u, key[v] = graph[u][v];

     }



     // Yapılandırılmış MST'yi ekrana bastırıyoruz.

     printMST(parent, V, graph);

}





// programı buradan test edebilirsiniz.

int main()

{

   /* aşağıdaki yapı gibi bir graf oluşturmak istersek

          2    3

      (0)--(1)--(2)

       |   / \   |

      6| 8/   \5 |7

       | /     \ |

      (3)-------(4)

            9          */

   int graph[V][V] = {{0, 2, 0, 6, 0},

                      {2, 0, 3, 8, 5},

                      {0, 3, 0, 0, 7},

                      {6, 8, 0, 0, 9},

                      {0, 5, 7, 9, 0},

                     };



    // çözümü ekrana bastıran fonksiyon

    primMST(graph);



    return 0;

}


Etiketler: , ,