TREE DAN GRAPH
A. Graph
Menurut Foulds (1994) graf
𝐺
adalah pasangan terurut (𝑉,𝐸)
dimana 𝑉
adalah himpunan simpul yang berhingga dan tidak kosong. Dan E adalah
himpunan sisi yang merupakan pasangan yang tidak terurut dari simpul (𝑖,𝑗)
dimana (𝑖,𝑗) ∈𝑉. Elemen
𝑉
dinamakan simpul (node) dan elemen 𝐸 dinamakan sisi (edge),
dinotasikan sebagai (𝑖,𝑗), yaitu sisi yang
menghubungkan simpul 𝑖 dengan simpul 𝑗, dengan (𝑖,𝑗)∈𝑉(Foulds,
1994).
Berdasarkan orientasi arah pada suatu graf, maka graf digolongkan
menjadi dua jenis, yaitu graf tak berarah (undirected graph) dan graf
berarah (directed graph) (Munir, 2010). Graf yang sisinya tidak
mempunyai orientasi arah disebut dengan graf tak berarah, urutan pasangan
simpul yang dihubungkan oleh sisi tidak diperhatikan. Jadi (𝑖,𝑗)=(𝑗,𝑖) adalah sisi yang
sama. Sisi pada graf ini dinamakan edge. Sedangkan Graf yang setiap
sisinya diberikan orientasi arah dinamakan graf berarah. Sisi berarah pada graf
ini dinamakan arc. Pada graf ini belum tentu (𝑖,𝑗)=(𝑗,𝑖) bisa saja (𝑖,𝑗)≠(𝑗,𝑖).
1. Graf Siklus (Cycle) Atau Sirkuit (Circuit)
Suatu
lintasan yang berawal dan berakhir disimpul yang sama dinamakan siklus atau
sirkuit (Munir, 2012). Pada gambar berikut siklus atau sirkuit terdapat pada
2,4,3,2.
2. Graf Berbobot
Graf
berbobot adalah graf yang setiap sisinya diberi sebuah harga atau bobot. Bobot
pada setiap sisi dapat berbeda-beda bergantung pada masalah yang dimodelkan
dengan graf. Bobot dapat menyatakan jarak antara dua buah kota, biaya
perjalanan antara dua buah kota, waktu tempuh pesan (message) dari
sebuah simpul komunikasi ke simpul komunikasi lain (dalam jaringan komputer),
ongkos produksi, dan sebagainya (Latifah, 2014).
B. Pohon (tree)
Pohon
dalam teori graf adalah sebuah graf yang mempunyai 𝑛 buah titik, 𝑛−1 sisi dan
tidak mempunyai lintasan (path) serta merupakan graf terhubung. Suatu
pohon titik yang berderajat 1 dinamakan daun (leaf) atau titik terminal
(terminal vertex), sedangkan titik yang berderajat lebih dari 1 disebut
titik cabang (branch vertex) atau titik internal (internal vertex)
(Wibisono, 2008: 159).
1. Pohon Merentang (Spanning Tree)
Pohon
perentang suatu graf terhubung 𝐺
adalah suatu subgraf 𝐺
yang merupakan pohon dan memuat semua titik dalam 𝐺 (Siang, 2009:
286). Berikut gambar graf lengkap dengan empat buah pohon perentang.
2. Pohon Merentang Minimum (Minimum Spanning Tree)
Jika
𝐺
adalah graf berbobot, maka bobot perentang 𝑇 dari 𝐺 didefenisikan
dengan jumlah bobot semua sisi di 𝑇.
Pohon perentang yang berbeda mempunyai bobot yang berbeda pula. Diantara semua
pohon perentang di 𝐺,
pohon perentang yang berbobot minimum dinamakan pohon merentang minimum (minimum
spanning tree) (Munir, 2005). Pada gambar berikut G adalah graf
berbobot, 𝑇1
dan 𝑇2
adalah pohon merentang berbobot dari graf G.
C.
Contoh
kasus Pendistribusian Obat ke Apotek-Apotek yang Ada di Kota Pelaihari
Di
kota Pelaihari terdapat beberapa apotek yang memiliki jarak beragam antara satu
dengan yang lainnya. Dalam pendistribusian obat-obatan, diperlukan jarak yang
paling minimum untuk membantu proses pengiriman obat agar cepat dan menghemat
waktu serta bahan bakar, sehingga pendistribusian obat menjadi lebih efisien.
Pencarian
jarak terpendek untuk melakukan pendistribusian obat ke masing-masing apotik
dapat dilakukan dengan menerapkan algoritma Dijkstra dan algoritma Kruskal.
D.
Algoritma
Dijkstra
Algoritma Dijkstra
dikstra ditemukan oleh Edsger.Wybe Dijkstra pada tahun 1959. Algoritma ini
merupakan algoritma yang dapat memecahkan masalah pencarian jalur terpendek
dari suatu graf pada setiap simpul yang bernilai tidak negatif. dijkstra
merupakan algoritma yang termasuk dalam algoritma greedy, yaitu algoritma yang
sering digunakan untuk memecahkan masalah yang berhubungan dengan suatu
optimasi. Dalam pencarian jalur terpendeknya algoritma dijkstra bekerja dengan
mencari bobot yang paling minimal dari suatu graf berbobot, jarak terpendek
akan diperoleh dari dua atau lebih titik dari suatu graf dan nilai total yang
didapat adalah yang bernilai paling kecil.
1.
Graf
Algoritma Dijkstra
2.
Matriks
Algoritma Dijkstra
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
|
0
|
0
|
255
|
0
|
0
|
0
|
0
|
0
|
0
|
1600
|
0
|
0
|
0
|
1
|
255
|
0
|
441
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
2
|
0
|
441
|
0
|
2760
|
0
|
0
|
0
|
0
|
1800
|
0
|
0
|
26
|
3
|
0
|
0
|
2760
|
0
|
7070
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
4
|
0
|
0
|
0
|
7070
|
0
|
5590
|
0
|
0
|
0
|
0
|
0
|
0
|
5
|
0
|
0
|
0
|
0
|
5590
|
0
|
1310
|
0
|
0
|
0
|
0
|
0
|
6
|
0
|
0
|
0
|
0
|
0
|
1310
|
0
|
656
|
0
|
1690
|
0
|
0
|
7
|
0
|
0
|
0
|
0
|
0
|
0
|
656
|
0
|
435
|
0
|
0
|
0
|
8
|
1600
|
0
|
1800
|
0
|
0
|
0
|
0
|
435
|
0
|
0
|
0
|
0
|
9
|
0
|
0
|
0
|
0
|
0
|
0
|
1690
|
0
|
0
|
0
|
20
|
0
|
10
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
20
|
0
|
30
|
11
|
0
|
0
|
26
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
30
|
0
|
3.
Program
Algoritma Dijkstra
Berikut merupakan source code untuk algoritma Dijkstra,
yaitu:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define INF 999
using namespace std;
int main()
{
int n,i,j,start;
printf("Masukan
Jumlah Vertex : ");
scanf("%d",&n);
int
G[n][n],tempGraf[n][n],jarak[n],visit[n],temp[n],count;
printf("Masukan
Matrix Graf : \n");
for(i = 0;i < n
;i++)
{
for
(j=0;j<n;j++)
{
cout<<"Matriks
["<<i<<"]["<<j<<"]: ";
scanf("%d",&G[i][j]);
}
}
printf("Masukan
Vertex Asal : ");
scanf
("%d",&start);
for(i=0;i<n;i++)
{
for
(j=0;j<n;j++)
{
if (G[i][j] ==
0)
{
tempGraf[i][j] = INF;
}
else{
tempGraf[i][j] = G[i][j];
}
}
}
for (i = 0;i<n;i++)
{
jarak[i] =
tempGraf[start][i];
temp[i] = start;
visit[i] = 0;
}
jarak[start] = 0;
visit[start] = 1;
count =1; //dimulai dari 1 karena kita tidak akan menghitung
vertex asal lagi
//proses untuk
menghitung vertex yang dikunjungi
int
jarakmin,nextvertex;
while (count < n-1)
{
jarakmin = INF;
for
(i=0;i<n;i++)
{
//jika jarak
lebih kecil dari jarak minimum dan vertex belum dikunjungi
// maka jarak
minimum adalah jarak yang sudah dibandingkan sebelumnya dengan jarakmin
if(jarak[i] < jarakmin && visit[i]!=1)
{
jarakmin = jarak[i];
nextvertex = i; //untuk memberikan vertex pada jarak minimum
}
}
// untuk mengecek
vertex selanjutnya yang terhubung dengan vertex lain yang memiliki jarak
minimum
visit[nextvertex]
= 1;
for(i =
0;i<n;i++)
{
if(visit[i]!=1)
{
if(jarakmin+tempGraf[nextvertex][i]<jarak[i])
{
jarak[i] = jarakmin+tempGraf[nextvertex][i];
temp[i] = nextvertex;
}
}
}
count++;
}
//nenampilkan jalur
dan jarak untuk setiap vertex
int a[n+1],k;
for (i = 0; i < n
;i++)
{
if(i!=start)
{
printf
("\nHasil jarak untuk vertex ke-%d adalah %d\n",i,jarak[i]);
j=i;
printf
("%d<-",i);
while(j!=start)
{
j=temp[j];
printf
("%d",j);
if(j!=start)
{
printf
("<-");
}
}
}
}
printf ("\nTotal
Jaraknya adalah %d\n",jarak[n-1]);
return 0;
}
E.
Algoritma
Kruskal
Algoritma
Kruskal merupakan salah satu algoritma dalam teori graf untuk menyelesaikan
persoalan pohon merentang minimum. Pada Algoritma Kruskal, sisi-sisi didalam
graf diurutkan terlebih dahulu berdasarkan bobotnya dari kecil ke besar.
2.
Matriks
Algoritma Kruskal
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
|
1
|
0
|
255
|
0
|
0
|
0
|
0
|
0
|
0
|
1600
|
0
|
0
|
0
|
2
|
255
|
0
|
441
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
3
|
0
|
441
|
0
|
2760
|
0
|
0
|
0
|
0
|
1800
|
0
|
0
|
26
|
4
|
0
|
0
|
2760
|
0
|
7070
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
5
|
0
|
0
|
0
|
7070
|
0
|
5590
|
0
|
0
|
0
|
0
|
0
|
0
|
6
|
0
|
0
|
0
|
0
|
5590
|
0
|
1310
|
0
|
0
|
0
|
0
|
0
|
7
|
0
|
0
|
0
|
0
|
0
|
1310
|
0
|
656
|
0
|
1690
|
0
|
0
|
8
|
0
|
0
|
0
|
0
|
0
|
0
|
656
|
0
|
435
|
0
|
0
|
0
|
9
|
1600
|
0
|
1800
|
0
|
0
|
0
|
0
|
435
|
0
|
0
|
0
|
0
|
10
|
0
|
0
|
0
|
0
|
0
|
0
|
1690
|
0
|
0
|
0
|
20
|
0
|
11
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
20
|
0
|
30
|
12
|
0
|
0
|
26
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
30
|
0
|
3.
Program
Algoritma Kruskal
Berikut merupakan source code untuk algoritma Dijkstra,
yaitu:
#include
<cstdlib>
#include
<iostream>
#include
<fstream>
using
namespace std;
class
kruskal
{
private:
int n ;//no of nodes
int noe; //no edges in the graph
int graph_edge[100][4];
int tree[10][10];
int sets[100][10];
int top[100];
public:
int read_graph();
void initialize_span_t();
void sort_edges();
void algorithm();
int find_node(int );
void print_min_span_t();
};
int
kruskal::read_graph()
{
///cout<<"Program
ini Mengimplementasikan Algoritma Kruskal\n";
cout<<"Banyak
titik graph : ";
cin>>n;
noe=0;
cout<<"\nJarak
antar tiap titik:\n";
for(int
i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
cout<<"("<<i<<" ,
"<<j<<") = ";
int w;
cin>>w;
if(w!=0)
{
noe++;
graph_edge[noe][1]=i;
graph_edge[noe][2]=j;
graph_edge[noe][3]=w;
}
}
}
}
void
kruskal::sort_edges()
{
/** Sort
the edges using bubble sort in increasing order******/
for(int
i=1;i<=noe-1;i++)
{
for(int j=1;j<=noe-i;j++)
{
if(graph_edge[j][3]>graph_edge[j+1][3])
{
int t=graph_edge[j][1];
graph_edge[j][1]=graph_edge[j+1][1];
graph_edge[j+1][1]=t;
t=graph_edge[j][2];
graph_edge[j][2]=graph_edge[j+1][2];
graph_edge[j+1][2]=t;
t=graph_edge[j][3];
graph_edge[j][3]=graph_edge[j+1][3];
graph_edge[j+1][3]=t;
}
}
}
cout<<"\n\nSetelah
Jarak diurutkan adalah ::\n";
for(int
i=1;i<=noe;i++)
cout<<"("<<
graph_edge[i][1]
<<"
, "<<graph_edge[i][2]
<<"
) = "<<graph_edge[i][3]<<endl;
}
void
kruskal::algorithm()
{
for(int i=1;i<=n;i++)
{
sets[i][1]=i;
top[i]=1;
}
cout<<"\nRentang
Yang di Pakai\n\n";
for(int i=1;i<=noe;i++)
{
int p1=find_node(graph_edge[i][1]);
int p2=find_node(graph_edge[i][2]);
if(p1!=p2)
{
cout<<"Rentang yg masuk
ke pohon ::"
<<" <
"<<graph_edge[i][1]<<" , "
<<graph_edge[i][2]<<" >
"<<endl<<endl;
tree[graph_edge[i][1]][graph_edge[i][2]]=graph_edge[i][3];
tree[graph_edge[i][2]][graph_edge[i][1]]=graph_edge[i][3];
// Mix the two sets
for(int j=1;j<=top[p2];j++)
{
top[p1]++;
sets[p1][top[p1]]=sets[p2][j];
}
top[p2]=0;
}
else
{
cout<<"Jika "
<<" <
"<<graph_edge[i][1]<<" , "
<<graph_edge[i][2]<<" > "<<"di
masukkan, maka terbentuk siklus. jadi di hapus\n\n";
}
}
}
int
kruskal::find_node(int n)
{
for(int i=1;i<=noe;i++)
{
for(int j=1;j<=top[i];j++)
{
if(n==sets[i][j])
return i;
}
}
return -1;
}
int
main(int argc, char *argv[])
{
kruskal obj;
obj.read_graph();
obj.sort_edges();
obj.algorithm();
system("PAUSE");
return EXIT_SUCCESS;
}






Komentar
Posting Komentar