Algoritma Kruskal Menggunakan Bahasa C - Matematika Diskrit

Algoritma Kruskal

Algoritma Kruskal adalah algoritma untuk mencari pohon merentang minimum secara langsung didasarkan pada algoritma MST (Minimum Spanning Tree) umum. Pada algoritma Kruskal sisi-sisi di dalam graf diurut terlebih dahulu berdasarkan bobotnya dari kecil ke besar. Sisi yang dimasukkan ke dalam himpunan T adalah sisi graf G sedemikian sehingga T adalah pohon. Pada keadaan awal, sisi-sisi sudah diurut berdasarkan bobot membentuk hutan (forest). Hutan tersebut dinamakan hutan merentang (spanning forest). Sisi dari graf G ditambahkan ke T jika tidak membentuk sirkuit di T.
Perbedaan prinsip antara algoritma Prim dan Kruskal adalah jika pada algoritma Prim sisi yang dimasukkan ke dalam T harus bersisian dengan sebuah simpul di T, maka pada algoritma Kruskal sisi yang dipilih tidak perlu bersisian dengan simpul di T asalkan penambahan sisi tersebut tidak membentuk sirkuit.
Langkah-langkah dalam algoritma Kruskal adalah sebagai berikut:
1.   Lakukan pengurutan terhadap setiap sisi di graf mulai dari sisi dengan bobot terkecil sampai terbesar.
2.  Pilih sisi yang mempunyai bobot minimum yang tidak membentuk sirkuit di pohon. Tambahkan sisi tersebut ke dalam pohon.
3.  Ulangi langkah 2 sampai pohon merentang minimum terbentuk, yaitu ketika sisi di dalam pohon merentang minimum berjumlah n-1 (n adalah jumlah simpul di graf).

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void main()
{
int vertex, i, j, awal, kecil=999,v=0;

printf("Masukkan jumlah vertex : ");
scanf("%d", &vertex);
int titik[vertex][vertex];
int uji[vertex];

for(i=1;i<=vertex;i++)
{

for(j=i;j<=vertex;j++)
{
if(i==j)
{
titik[i][j]=0;
}
else
{
printf("\n Bobot [%d-%d] : ",i,j);
scanf("%d",&titik[i][j]);
titik[j][i] = titik[i][j];
}
}
}
printf("\nBentuk dalam Matriks : \n");
    for (i=1;i<=vertex;i++)
    {
        printf("\n");
        for (j=1;j<=vertex;j++)
            printf("%d\t",titik[i][j]);
    }

for(i=1;i<=vertex;i++)
{
for(j=i;j<=vertex;j++)
{
if(titik[i][j]<kecil&&titik[i][j]!=0)
{
kecil = titik[i][j];
}
}
}
awal = kecil;

int batas=0, min=0, a, b, bobot=0;
for(i=1;i<=vertex;i++)
{
uji[i]=999;
}

printf("\n\n");
printf("Hasil : \n");
uji[awal]=awal;
while(1)
{
min=999;
for(i=1;i<=vertex;i++)
{
if(uji[i]==i)
{
for(j=1;j<=vertex;j++)
{
if(titik[i][j]<min && titik[i][j]!=0)
{
min = titik[i][j];
a=i;
b=j;
}
}
}
}
titik[a][b]=0;
titik[b][a]=0;

int sama=0;
for(i=1;i<=vertex;i++)
{
if(uji[i]==b)
{
sama++;
}

}

if (sama==0)
{
printf("%d - %d : %d\n",a,b,min);
bobot+=min;
uji[b]=b;
v++;

}
if(v == vertex-1)
{
break;
}
batas++;
}

printf("Total : %d", bobot);
}

Postingan terkait:

Belum ada tanggapan untuk "Algoritma Kruskal Menggunakan Bahasa C - Matematika Diskrit"

Posting Komentar