Pohon
Pada diskusi mengenai graf kita sadari bahwa graf yang paling
penting baik secara teoritis maupun parktis adalah graf terhubung.
Di antara graf-graf terhubung pohon merupakan graf terhubung yang
paling sederhana, tetapi mempunyai aplikasi yang paling banyak.
Pada bab ini kita diskusikan pohon mulai dari aspek eksistensi, aspek
counting, maupun aspek optimisasi.
3t 3t 3t
@ @
@ @
t t t t t @t t @t
1 2 1 2 1 2 1 2
222
10.1 Sifat-sifat Pohon 223
Bila kita amati kembali pohon dengan 2 dan 3 titik pada Gam-
bar 10.1, maka setiap pohon mempunyai dua daun. Lemma 9.2
berikut memberikan batas bawah bagi banyak daun pada sebuah
pohon.
Bukti. Andaikan T adalah sebuah tree, maka setiap dua titik berbeda
dihubungkan oleh lintasan. Bila dua titk u dan v dihubungkan
oleh lebih dari satu lintasan berbeda, maka kedua lintasan tersebut
akan membnetuk sebuah cycle. Hal ini bertentangan dengan asumsi
bahwa T adalah sebuah pohon. Jadi setiap dua titik berbeda di T
dihubungkan oleh tepat satu lintasan sederhana.
Sebaliknya andaikan T adalah sebuah graf dengan sifat bahwa
setiap dua titik berbeda di T dihubungkan oleh tepat satu lintasan.
Sifat ini mengakibatkan T adalah terhubung. Jika T memuat sebuah
cycle C yang memuat titik u dan v, maka u dan v dihubungkan oleh
sedikitnya dua lintasan sederhana berbeda. Hal ini bertentangan
dengan hipotesis bahwa setiap dua titi berbeda dihubungkan oleh
10.2 Pohon Perentang 225
(b) G adalah terhubung, tetapi tidak terhubung bila satu sisi dari
G dibuang.
Bukti yang kita diskusikan di atas dilakukan atas dasar bukti den-
gan kontradiksi. Berikut diberikan bukti yang bersifat konstruktif,
yakni bukti ini memberikan cara untuk menemukan sebuah pohon
perentang pada graf terhubung.
t t t t t t
@@ @@
@t @t t
t t t
@ @
t @
@t t @
@t t t
Kita sadari bahwa digraf orientasi dari sebuah graf tidak tung-
gal. Hal ini berakibat bahwa matriks insidensi P dari digraf orientasi
tidak tunggal. Tetapi Teorema 10.2.2 menjamin bahwa bilangan po-
hon κ(G) dari sebuah graf G tidak bergantung pada pemilihan digraf
orientasinya. Sehingga dalam penentuan κ(G) kita bebas menggu-
nakan digraf orientasi.
Contoh 10.2.3
Perhatikan sebuah graf G beserta digraf D pada Gambar 10.2.
1t 2t 1t -2t
@
@ 6I
@
@6t @6t
6
t t
5@ 5@
t @
@t t @
R t?
4 G 3 4 D 3
(1, 2), (2, 3), (3, 4), (4, 1), (6, 1), (2, 6), (4, 5), (5, 3), (5, 6),
1 0 0 −1 −1 0 0 0 0
−1 1 0 0 0 1 0 0 0
0 −1 1 0 0 0 0 −1 0
P = .
0
0 −1 1 0 0 1 0 0
0 0 0 0 0 0 −1 1 1
0 0 0 0 1 −1 0 0 −1
228 Bab 10: Pohon
Perhatikan bahwa ekspresi pada sisi kiri dan sisi kanan dari per-
samaan (10.4) memenuhi relasi rekurensi yang sama (dalam hal ini
rekurensi pada persamaan (10.1) dan (10.3)), maka dngan induksi
persamaan (10.4) berlaku untuk semua n.
Pada persamaan (10.2) gantikan n dengan n − 2, k dengan n, ri
dengan di − 1 dan xi = 1, maka kita peroleh
X n−2
n−2
n =
d1 − 1, d2 − 1, . . . , dn − 1
X
= T (n; d1, d2 , . . . , dn).
v5 6 v6 v5 v6
u u u u
@4 2 @4 2
@ 3 @ 3
2 @u uv4 3 2 @u uv4 3
4 v3 @ v3
4@
u @u u u
v1 5 v2 v1 v2
Algoritma Kruskal
Input: Graf terhubung G dengan bobot w : E(G) → R
Output : Sebuah pohon perentang minimum T .
1. Urutkan sisi-sisi sehingga w(e1 ) ≤ w(e2 ) ≤ · · · ≤ w(em ).
2. Definisikan T := (V (G), ∅).
3. For i := 1 to m
If T + ei tidak memuat cycle
T := T + ei
Contoh
Kita perhatikan graf terhubung berbobot G pada Gambar 10.4. Bila
sisi-sisi dari G diurutkan dalam urutan
v1 v5 , v4 v6 , v2 v6 , v3 v4 , v2 v4 , v3 v5 , v1 v3 , v1 v2 , v5 v6
maka dalam setiap iterasi diperoleh subgraf seperti pada Gambar 10.5.
10.3 Pohon Perentang Minimum 231
t tv4 t tv4
v3 v3
t t t t
v1 v2 v1 v2
i=1
t tv4 t tv4
v3 v3
t t t t
v1 v2 v1 v2
i=2 i=3
vt5 vt6
t tv4
v3
t t
v1 v2
komponen(i) = i
komponen(u) 6= komponen(v),
function [pohon,bobot]=kruskal(matriks_sisi,titik)
[banyak_sisi,kolom_sisi]=size(matriks_sisi);
%urutkan sisi berdasarkan bobotnya
sisi_sort=sortrows(matriks_sisi,kolom_sisi);
%inisiasi awalnya terdapat n buah komponen
komponen=zeros(1,titik);
for i=1:titik
komponen(i)=i;
end
%inisiasi awalnya T adalah pohon kosong
pohon_hasil=zeros(titik-1,2);
total_bobot=0;
sisi_terpilih=0;
% seleksi sisi yang terpilih ke dalam pohon
for sisi=1:banyak_sisi
ujung_kiri=sisi_sort(sisi,1);
ujung_kanan=sisi_sort(sisi,2);
%cek sisi berada di komponen berbeda
if komponen(ujung_kiri) ~= komponen(ujung_kanan)
total_bobot=total_bobot+sisi_sort(sisi,3);
sisi_terpilih=sisi_terpilih+1;
pohon_hasil(sisi_terpilih,:)=sisi_sort(sisi,1:2);
temp=komponen(ujung_kanan);
% masukan titik ujung sisi terpilih ke
%komponen yang sama
komponen(ujung_kanan)=komponen(ujung_kiri);
for i=1:titik
if (komponen(i)==temp)
komponen(i)=komponen(ujung_kiri);
end
end
end
10.3 Pohon Perentang Minimum 235
end
bobot=total_bobot;
pohon=pohon_hasil;
Algoritma Prim
1. Pilih titik v ∈ V (G). Set T := (V (G), ∅), dan V S := {v}
2. For i=1 to |V (G)| − 1
Pilih sisi bobot terkecil e = {u, w}, u ∈ V S, w ∈ V (G) − V (S)
V S := V S ∪ {w}
T := T + e
Contoh
Kita perhatikan kembali graf terhubung berbobot pada Gambar 10.4.
Kita aplikasikan Algorima Prim dalam membangun sebuah pohon
perentang minimum. Algoritma kita mulai dengan V S = {v1 }. Sub-
pohon yang diperoleh pada setiap iterasi adalah seperti pada Gam-
bar 10.7.
236 Bab 10: Pohon
t tv4 t tv4
v3 v3
t t t t
v1 v2 v1 v2
i=1
t tv4 t tv4
v3 v3
t t t t
v1 v2 v1 v2
i=2 i=3
t tv4 t tv4
v3 v3
t t t t
v1 v2 v1 v2
i=4 i=5
Gambar 10.7 Pembentukan pohon perentang minimum
dengan Algoritma Prim
T1 = H + ei − e0
function [bobot,pohon]=prim(matriks_tetangga)
[baris,kolom]=size(matriks_tetangga);
%inisiasi titik 1 ada di pohon
Set_ttk_pohon=zeros(1,baris); Set_ttk_pohon(1)=1;
%semua titik ada di luar pohon kecuali titik 1
Set_ttk_luar=ones(1,baris); Set_ttk_luar(1)=0;
bobot=0;
%inisiasi pohon kosong
pohon=zeros(baris-1,3);
% pilih sisi dengan bobot tekecil ke pohon
for k=1:baris-1
maks=inf;
for i=1:baris
for j=1:baris
%pastikan satu ttk diluar satu di dlm pohon
if Set_ttk_luar(i)~=0 & Set_ttk_pohon(j)~=0
temp=matriks_tetangga(i,j);
if temp<=maks
maks=temp;
catat_kiri=i; catat_kanan=j;
catat_bobot=maks;
end
end
end
end
%masukan titik terpilih ke pohon
Set_ttk_luar(catat_kiri)=0;
Set_ttk_pohon(catat_kiri)=1;
pohon(k,:)=[catat_kiri catat_kanan catat_bobot];
bobot=bobot+catat_bobot;
end
Contoh
Perhatikan graf berbobot pada Gambar 10.8.
vt1 2 vt2
@
@
1 @1 2
@
t @@t
v4 2 v3
240 Bab 10: Pohon
Gambar 10.8
kendala.