![]() |
| Prims Algoritması |
#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: Min key fonksiyonu, Prims algoritması c kodu, prims asgari tarama ağacı