Algoritme Prim adalah sebuah algoritme dalam teori graf untuk mencari pohon rentang minimum untuk sebuah graf berbobot yang saling terhubung. Ini berarti bahwa sebuah himpunan bagian dari edge yang membentuk suatu pohon yang mengandung node, di mana bobot keseluruhan dari semua edge dalam pohon diminimalisasikan. Bila graf tersebut tidak terhubung, maka graf itu hanya memiliki satu pohon rentang minimum untuk satu dari komponen yang terhubung. Algoritme ini ditemukan pada 1930 oleh matematikawan Vojtěch Jarník dan kemudian secara terpisah oleh computer scientist Robert C. Prim pada 1957 dan ditemukan kembali oleh Dijkstra pada 1959. Karena itu algoritme ini sering dinamai algoritme DJP atau algoritme Jarnik.
Langkah-langkahnya adalah sebagai berikut:
- buat sebuah pohon yang terdiri dari satu node, dipilih secara acak dari graf
- buat sebuah himpunan yang berisi semua cabang di graf
- loop sampai semua cabang di dalam himpunan menghubungkan dua node di pohon
- hapus dari himpunan satu cabang dengan bobot terkecil yang menghubungkan satu node di pohon dengan satu node di luar pohon
- hubungkan cabang tersebut ke pohon
Dengan struktur data binary heap sederhana, algoritme Prim dapat ditunjukkan berjalan dalam waktu O(Elog V), di mana E adalah jumlah cabang dan V adalah jumlah node. Dengan Fibonacci heap, hal ini dapat ditekan menjadi O(E + Vlog V), yang jauh lebih cepat bila grafnya cukup padat sehingga E adalah (Vlog V).
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main()
{
int vertex, i, j, awal,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]);
}
printf("\nMasukkan vertex awal yang dipilih : ");
scanf("%d", &awal);
int batas=0, min, a, b, bobot=0;
for(i=1;i<=vertex;i++)
{
uji[i]=999;
}
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);
}
Belum ada tanggapan untuk "Algoritma Prim Menggunakan Bahasa C - Matematika Diskrit"
Posting Komentar