Objektif :
1. Mahasiswa Mengetahui Pengetahuan Dasar tentang Pohon.
2. Mahasiswa Mampu Memahami tentang Pohon Rentangan.
3. Mahasiswa Mampu Memahami dan Menghitung Pohon Rentangan Minimum dengan
Menggunakan Algoritma Kruskal.
4. Mahasiswa Mampu Memahami dan Menghitung Pohon Rentangan Minimum dengan
Menggunakan Algoritma Prim.
Sifat-sifat Pohon
Pohon memiliki beberapa sifat yang ‘indah’, misalnya setiap dua simpulnya dihubungkan oleh tepat
satu buah lintasan. Dalam membuktikan sebuah teorema umum untuk graf, terkadang kita akan sangat
terbantu dengan terlebih dahulu membuktikan kebenarannya untuk pohon. Pada kenyataannya, terdapat
beberapa gagasan baru yang belum dapat dibuktikan kebenarannya bagi graf secara umum, namun telah
diketahui berlaku bagi pohon.
Teorema berikut memamparkan beberapa ciri sederhana sebuah pohon.
Misalkan G adalah graf tak berarah sederhana dan jumlah simpulnya n. Maka, pernyataan-
pernyataan berikut semuanya setara:
1. G adalah sebuah pohon
2. G tidak memuat siklus, dan memiliki n – 1 rusuk
3. G terhubung, dan memiliki n – 1 rusuk
4. G terhubung, dan setiap rusuknya adalah sebuah jembatan
5. Setiap dua simpul dalam G dihubungkan oleh persis satu buah lintasan
6. G tidak memuat siklus, namun penambahan setiap rusuk baru akan membentuk persis satu
buah siklus
Algoritma Kruskal
Algoritma Kruskal adalah algoritma pohon merentang minimum yang mengambil graf sebagai input
dan menemukan himpunan bagian dari sisi-sisi dari graf tersebut yang membentuk pohon yang
mencakup setiap simpul dan memiliki jumlah bobot minimum di antara semua pohon yang dapat
dibentuk dari grafik.
Langkah-langkah penyusunan minimum spanning tree menggunakan algoritma kruskal:
o Langkah 1: Pilih e1 sebuah sisi di graf G sehingga w(e1) sekecil mungkin dan e1 bukan loop
o Langkah 2: Jika sisi-sisi e1, e2,…, ei telah dipilih, lalu pilih sebuah sisi e1+1, yang belum
dipilih sedemikian sehingga
Subgraf G = [{e1,…, ei+1}] adalah asiklik dan
w(ei+1) adalah sekecil mungkin (syarat no (i))
o Langkah 3: Jika graf G memiliki n simpul, hentikan langkah tersebut setelah memilih n – 1
sisi. Jika tidak, ulangi langkah 2
A
3 1
F 3 B
3 4 2
4
1
E 5 C
4 2
D
Graf G
Mencari bobot minimum spanning tree graf G dengan menggunakan algoritma kruskal:
A
3 1
F 3 B
3 4 2
4
1
E 5 C
4 2
D
Graf G
Mencari bobot minimum spanning tree graf G dengan menggunakan algoritma prim:
Algoritma Kruskal adalah algoritma pohon merentang minimum yang mengambil graf sebagai input dan
menemukan himpunan bagian dari sisi-sisi graf tersebut yang
Ini termasuk dalam kelas algoritma yang disebut algoritma greedy yang menemukan optimal lokal
dengan harapan menemukan optimal global.
Kita mulai dari sisi dengan bobot terendah dan terus menambahkan sisi sampai kita mencapai tujuan
kita
2. Pilih sisi yang bobotnya paling kecil, jika lebih dari 1 pilih siapa saja
3. Pilih sisi terpendek berikutnya dan tambahkan
4. Pilih sisi terpendek berikutnya yang tidak membuat siklus dan tambahkan
5. Pilih sisi terpendek berikutnya yang tidak membuat siklus dan tambahkan
Cara paling umum untuk mengetahui hal ini adalah algoritma yang disebut Union Find. Algoritma Union
Find membagi simpul ke dalam cluster dan memungkinkan kita untuk memeriksa apakah dua simpul
milik cluster yang sama atau tidak dan karenanya memutuskan apakah menambahkan sisi menciptakan
sebuah siklus.
KRUSKAL(G):
A = ∅
Untuk setiap simpul v G.V:
MAKE-SET(v)
Untuk setiap sisi (u, v) G.E diurutkan berdasarkan bertambahnya bobot(u, v):
if FIND-SET(u) ≠ FIND-SET(v):
A = A ∪ {(u, v)}
UNION(u, v)
return A
#include <stdio.h>
#define MAX 30
sisi_list elist;
int Graph[MAX][MAX], n;
sisi_list spanlist;
void kruskalAlgo();
int cari(int belongs[], int vertexno);
void applyUnion(int belongs[], int c1, int c2);
void urut();
void cetak();
urut();
if (cno1 != cno2) {
spanlist.data[spanlist.n] = elist.data[i];
spanlist.n = spanlist.n + 1;
applyUnion(belongs, cno1, cno2);
}
}
}
// Algoritma penyortiran
void urut() {
int i, j;
sisi temp;
// Mencetak hasil
void cetak() {
int i, cost = 0;
int main() {
int i, j, total_cost;
n = 6;
Graph[0][0] = 0;
Graph[0][1] = 4;
Graph[0][2] = 4;
Graph[0][3] = 0;
Graph[0][4] = 0;
Graph[0][5] = 0;
Graph[0][6] = 0;
Graph[1][0] = 4;
Graph[1][1] = 0;
Graph[1][2] = 2;
Graph[1][3] = 0;
Graph[1][4] = 0;
Graph[1][5] = 0;
Graph[1][6] = 0;
Graph[2][0] = 4;
Graph[2][1] = 2;
Graph[2][2] = 0;
Graph[2][3] = 3;
Graph[2][4] = 4;
Graph[2][5] = 0;
Graph[2][6] = 0;
Graph[3][0] = 0;
Graph[3][1] = 0;
Graph[3][2] = 3;
Graph[3][3] = 0;
Graph[3][4] = 3;
Graph[3][5] = 0;
Graph[3][6] = 0;
Graph[4][0] = 0;
Graph[4][1] = 0;
Graph[4][2] = 4;
Graph[4][3] = 3;
Graph[4][4] = 0;
Graph[4][5] = 0;
Graph[4][6] = 0;
Graph[5][0] = 0;
Graph[5][1] = 0;
Graph[5][2] = 2;
Graph[5][3] = 0;
Graph[5][4] = 3;
Graph[5][5] = 0;
Graph[5][6] = 0;
kruskalAlgo();
cetak();
}
Output Program:
Contoh Demo Program Algoritma Prim
Algoritma prim adalah algoritma pohon merentang minimum yang mengambil graf sebagai input dan
menemukan himpunan bagian dari sisi-sisi dari graf tersebut yang
• membentuk pohon yang mencakup setiap simpul
• memiliki jumlah bobot minimum di antara semua pohon yang dapat dibentuk dari grafik
1. Inisialisasi pohon merentang minimum dengan simpul yang dipilih secara acak.
2. Temukan semua tepi yang menghubungkan pohon ke simpul baru, temukan minimum dan tambahkan ke
pohon
3. Terus ulangi langkah 2 sampai kita mendapatkan pohon merentang minimum
5. Pilih sisi terdekat yang belum ada dalam solusi, jika ada beberapa pilihan, pilih salah satu secara
acak
T = ∅;
U = { 1 };
while (U ≠ V)
biarkan (u, v) menjadi sisi biaya terendah sehingga u U dan v V - U;
T = T ∪ {(u, v)}
U = U ∪ {v}
Kita dapat merepresentasikan keterhubungan graf ini dalam bentuk matriks seperti di bawah ini, dengan
kondisi:
A direpresentasikan menjadi 0
B direpresentasikan menjadi 1
C direpresentasikan menjadi 2
D direpresentasikan menjadi 3
E direpresentasikan menjadi 4
F direpresentasikan menjadi 5
0 1 2 3 4 5
0 0 4 4 0 0 0
1 4 0 2 0 0 0
2 4 2 0 3 2 4
3 0 0 3 0 0 3
4 0 0 2 0 0 3
5 0 0 4 3 3 0
/* Program C untuk Algoritma Prim */
/* Algoritma Spanning Tree (MST). Programnya adalah
untuk representasi matriks ketetanggaan dari grafik */
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
return min_index;
}
// Fungsi utilitas untuk mencetak MST yang dibuat yang disimpan di induk[]
// Perbarui nilai key dan indeks induk dari simpul yang berdekatan
dari simpul yang dipilih.
// Pertimbangkan hanya simpul yang belum termasuk dalam MST
for (int v = 0; v < V; v++)
printMST(parent, graph);
}
// Program utama
int main()
{
int graph[V][V] = {
{0, 4, 4, 0, 0, 0},
{4, 0, 2, 0, 0, 0},
{4, 2, 0, 3, 2, 4},
{0, 0, 3, 0, 0, 3},
{0, 0, 2, 0, 0, 3},
{0, 0, 4, 3, 3, 0}};
// Cetak Solusi
primMST(graph);
return 0;
}
Output Program:
Sisi Bobot
0 - 1 4
1 - 2 2
2 - 3 3
2 - 4 2
4 - 5 3
Referensi
Daniel, F., & Taneo, P. N. (2019). Teori Graf. Yogyakarta: Deepublish.
Lipschutz, S. (2008). Matematika Diskrit (Schaum's Outlines). Jakarta: Erlangga.
Wilson, R. J. (2010). Pengantar Teori Graf. Jakarta: Erlangga
https://www.programiz.com/.