logologo

Kruskal Algoritması

Bilişim Ve İletişim Teknolojileri+1 Daha
fav gif
Kaydet
viki star outline

Kruskal algoritması, bir grafiği girdi olarak alan ve bu grafiğin kenarlarının alt kümesini bulan bir minimum yayılan ağaç algoritmasıdır. Her tepe noktasını içeren bir ağaç oluşturulur ve bu ağaç, girdi olarak alınan grafikten oluşturulabilecek tüm ağaçlar arasında minimum ağırlık toplamına sahiptir.


Kruskal Algoritması Çalışma Mantığı

Kruskal algoritmasında en düşük ağırlığa sahip kenarlardan başlanır ve hedefe ulaşana kadar kenar eklemeye devam edilir. Sırasıyla şu adımlar uygulanır:


1. Tüm kenarlar düşük ağırlıktan yükseğe doğru sıralanır.

2. En düşük ağırlığa sahip kenar alınır ve yayılan ağaca eklenir. Kenarın eklenmesi bir döngü yaratıyorsa, bu kenar reddedilir.

3. Tüm köşelere ulaşana kadar kenar eklenmeye devam edilir.


Kruskal Algoritması Örneği

1- Ağırlıklı bir grafik (graph) oluşturulur.


2- En az ağırlığa sahip kenar seçilir, 1'den fazla varsa herhangi biri seçilir.


3- Bir sonraki en kısa kenar seçilir ve eklenir.


4- Döngü oluşturmayan bir sonraki en kısa kenar seçilir ve eklenir.


5- Döngü oluşturmayan bir sonraki en kısa kenar seçilir ve eklenir.


6- Yayılan bir ağaç oluşana kadar tüm adımlar tekrarlanır.


Kruskal Algoritması Pseudocode

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


Kruskal Algoritmasının Java ile Açıklanması

import java.util.*;

class Graph {
  class Edge implements Comparable {
    int src, dest, weight;

    public int compareTo(Edge compareEdge) {
      return this.weight - compareEdge.weight;
    }
  };

  class subset {
    int parent, rank;
  };

  int vertices, edges;
  Edge edge[];

  // Graph oluşturma
  Graph(int v, int e) {
    vertices = v;
    edges = e;
    edge = new Edge[edges];
    for (int i = 0; i < e; ++i)
      edge[i] = new Edge();
  }

  int find(subset subsets[], int i) {
    if (subsets[i].parent != i)
      subsets[i].parent = find(subsets, subsets[i].parent);
    return subsets[i].parent;
  }

  void Union(subset subsets[], int x, int y) {
    int xroot = find(subsets, x);
    int yroot = find(subsets, y);

    if (subsets[xroot].rank < subsets[yroot].rank)
      subsets[xroot].parent = yroot;
    else if (subsets[xroot].rank > subsets[yroot].rank)
      subsets[yroot].parent = xroot;
    else {
      subsets[yroot].parent = xroot;
      subsets[xroot].rank++;
    }
  }

  // Kruskal Algoritması uygulama
  void KruskalAlgo() {
    Edge result[] = new Edge[vertices];
    int e = 0;
    int i = 0;
    for (i = 0; i < vertices; ++i)
      result[i] = new Edge();

    Arrays.sort(edge);
    subset subsets[] = new subset[vertices];
    for (i = 0; i < vertices; ++i)
      subsets[i] = new subset();

    for (int v = 0; v < vertices; ++v) {
      subsets[v].parent = v;
      subsets[v].rank = 0;
    }
    i = 0;
    while (e < vertices - 1) {
      Edge next_edge = new Edge();
      next_edge = edge[i++];
      int x = find(subsets, next_edge.src);
      int y = find(subsets, next_edge.dest);
      if (x != y) {
        result[e++] = next_edge;
        Union(subsets, x, y);
      }
    }
    for (i = 0; i < e; ++i)
      System.out.println(result[i].src + " - " + result[i].dest + ": " + result[i].weight);
  }

  public static void main(String[] args) {
    int vertices = 6; // Number of vertices
    int edges = 8; // Number of edges
    Graph G = new Graph(vertices, edges);

    G.edge[0].src = 0;
    G.edge[0].dest = 1;
    G.edge[0].weight = 4;

    G.edge[1].src = 0;
    G.edge[1].dest = 2;
    G.edge[1].weight = 4;

    G.edge[2].src = 1;
    G.edge[2].dest = 2;
    G.edge[2].weight = 2;

    G.edge[3].src = 2;
    G.edge[3].dest = 3;
    G.edge[3].weight = 3;

    G.edge[4].src = 2;
    G.edge[4].dest = 5;
    G.edge[4].weight = 2;

    G.edge[5].src = 2;
    G.edge[5].dest = 4;
    G.edge[5].weight = 4;

    G.edge[6].src = 3;
    G.edge[6].dest = 4;
    G.edge[6].weight = 3;

    G.edge[7].src = 5;
    G.edge[7].dest = 4;
    G.edge[7].weight = 3;
    G.KruskalAlgo();
  }

Kaynakça

Programiz. "Kruskal'a Algorithm." Erişim Adresi.


Köse, Ümit. "Kruskal Algoritması." (2014). Erişim Adresi.


Geeksforgeeks. "Kruskal's Minimum Spanning Tree (MST) Algorithm." (2024). Erişim Adresi.


Takeuforward. "Kruskal'a Algorithm - Minimum Spanning Tree" Erişim Adresi.

Sen de Değerlendir!

0 Değerlendirme

Yazar Bilgileri

Avatar
Ana YazarBeyza Nur Türkü12 Şubat 2025 10:53
KÜRE'ye Sor