GRAPH
Matakuliah Algoritma dan Struktur Data
Target Study
Pengantar
Definisi
Contoh
Istilah
Jenis Graph
Undirected Graph
Directed Graph (Digraph)
Target Study Cont
…
Representasi graph
Adjacency Matrix
Adjacency Lists
Metode Penelusuran Graph
DFS (Depth First Search) : Pencarian Mendalam
BFS (Breadth First Search) : Pencarian Melebar
Minimum Spanning Tree
Algoritma Kruskal
DEFINISI GRAPH
Graph adalah struktur data yang memiliki relasi many to many, yaitu tiap element dapat memiliki 0 atau lebih dari 1 cabang.
Graph terbentuk dari 2 bagian, yaitu node dan edge.
Node : digunakan untuk menyimpan data
DEFINISI GRAPH CONT
…
Graph adalah kumpulan dari simpul dan busur yang
secara matematis dinyatakan sebagai :
G = (V, E)
Dimana
G = Graph
Sebuah graph mungkin hanya terdiri dari satu
simpul
Sebuah graph belum tentu semua simpulnya
terhubung dengan busur
Sebuah graph mungkin mempunyai simpul yang
tak terhubung dengan simpul yang lain
Sebuah graph mungkin semua simpulnya saling
berhubungan
CONTOH GRAPH
Jaringan pertemanan pada Facebook.
Toni Nina
Ale Firda
Joko
Riza
PENJABARAN
Jika =>
G = (N,E)
Dimana :
G
adalah Graph,
N
adalah Node, dan
E
adalah Edge.
Sehingga dari contoh graph facebook tersebut dapat dijabarkan:
N = {Nina, Toni, Ale, Riza, Joko, Firda}
E = {{Nina,Toni},{Toni,Riza},{Nina, Riza}, {Toni,Ale},
{Ale,Joko},{Riza,Joko},{Firda,Joko}}
*
N: para anggota Facebook
ISTILAH PADA GRAPH
Incident
Jika e merupakan busur dengan simpul-simpulnya adalah v dan w yang ditulis e=(v,w), maka v dan w disebut “terletak” pada e, dan e disebut incident dengan v dan w.
Degree (derajat)
Indegree
Jumlah busur yang kepalanya incident dengan simpul tersebut, atau
jumlah busur
yang “
masuk
”
atau menuju simpul tersebut.
Outdegree
Jumlah busur yang ekornya incident dengan simpul tersebut, atau
jumlah busur
yang “
keluar
”
atau berasal dari simpul tersebut.
Pada graph tidah berarah, 2 buah simpul disebut adjacent
bila ada busur yang menghubungkan kedua simpul
tersebut. Simpul v dan w disebut adjacent.
Pada graph berarah, simpul v disebut adjacent dengan
simpul w bila ada busur dari w ke v.
w e
v
v
e w
Successor dan Predecessor
Pada graph berarah, bila simpul v adjacent dengan simpul w, maka simpul v adalah successor simpul w, dan simpul w adalah predecessor dari simpul v.
Path
Sebuah path adalah serangkaian simpul-simpul yang berbeda, yang adjacent secara berturut-turut dari simpul satu ke simpul berikutnya.
1 4 3 2 4 2 4 2 4 2 1 3 1 3 1 3
B A C D E
Undirected graph
vertex
edge
e1 e4 e3
e7 e5 e2 e6 v1 v2 v4 v5 v3
V terdiri dari
v1, v2, …, v5
JENIS GRAPH
Graph dibedakan menjadi beberapa jenis, antara lain :
1.
Undirected Graph
2.
Directed Graph (Digraph)
UNDIRECTED GRAPH
Biasa disingkat : undi-graph.
Yaitu graph yang tidak memiliki arah.
Setiap sisi berlaku dua arah.
Misalkan : {x,y}
Arah bisa dari x ke y, atau y ke x.
Secara grafis sisi pada undigraph tidak memiliki mata panah dan secara notasional menggunakan kurung kurawal.
Notasional
G = {V, E}
V = {A, B, C, D, E, F, G, H, I,J, K, L, M}
Contoh Undi-Graph
2
3 1
4
5
6
Directed Graph
Biasa disingkat : Di-graph.
Yaitu graph yang memiliki arah.
Setiap edge
Digraph
memiliki anak panah yang mengarah ke node
tertentu.
Secara notasi sisi digraph ditulis sebagai vektor (u, v).
u =
origin (vertex asal)
v =
terminus (vertex tujuan)
Notasional
G = {V, E}
V = {A, B, C, D, E, F, G, H, I,J, K, L, M}
E = {(A,B),(A,C), (A,D), (A,F), (B,C), (B,H), (C,E), (C,G), (C,H), (C,I), (D,E),
Contoh Digraph
2
3 1
4
5
6
GRAPH BERARAH DAN GRAPH TAK BERARAH
B A C D E B A C D EDirected graph
Undirected graph
e1 e3 e4 e7 e5 e2 e6 v1 v2 v4 v5 v3 v1 v2 v3 v5 v4 e1 e2 e3 e4 e5 e6 e7 e8 e9 e10
GRAPH BERBOBOT (WEIGHTED GRAPH)
Jika setiap busur mempunyai nilai yang menyatakan hubungan
antara 2 buah simpul, maka busur tersebut dinyatakan memiliki
bobot.
Bobot sebuah busur dapat menyatakan panjang sebuah jalan dari
2 buah titik, jumlah rata-rata kendaraan perhari yang melalui
sebuah jalan, dll.
CONTOH WEIGTH GRAPH
B A
C E
F
D
2
2
2
4
GRAPH BERBOBOT
B A C D E B A C D EDirected graph
Undirected graph
5 3 12 6 8 4 3 v1 v2 v4 v5 v3 v1 v2 v3 v5 v4 5 e2 3 12 8 3 6 4 7 10
Representasi Graph
Representasi graph dibedakan menjadi 2 : 1. Adjacency Matrix
dapat direpresentasikan dengan matriks (array 2 Dimensi).
2. Adjacency Lists
Adjacency Matrix
Representasi Graph berupa Matrik ordo nxn. dimana n = node.
Baris berisi Node asal, sedangkan kolom berisi Node tujuan.
Jika graph tidak berbobot
,maka nilai matriks diisi dengan 1
atau 0. nilai 1 jika ada edge, dan 0 jika tidak ada edge antar
node.
A(i,j) = 1
, jika antara node i dan node j terdapat edge/terhubung.
Undi-graph
2 3 1 4 51 2 3 4 5 1
2 3 4 5
0 1 0 1 0
1 0 0 0 1
0 0 0 0 1
1 0 0 0 1
0 1 1 1 0
•
Diagonal entries are zero.
•
Adjacency matrix of an undirected graph is
symmetric.
A(i,j) = A(j,i) for all i and j.
i
Adjacency Matrix
2 3 1 4 51 2 3 4 5
1 2 3 4 5
0 1 0 1 0
1 0 0 0 1
0 0 0 0 1
1 0 0 0 1
0 1 1 1 0
i
Di-graph
Dimungkinkan tidak simetris jika terdapat loop.
2
3
1
4
5
1 2 3 4 5 1
2 3 4 5
0 0 0 1 0
1 0 0 0 1
0 0 0 0 0
0 0 0 0 1
0 1 1 0 0
i
REPRESENTASI GRAPH DALAM BENTUK MATRIX
Adjacency Matrix Graph tak berarah
0
1
0
1
0
1
0
1
0
1
0
1
0
1
1
1
0
1
0
1
0
1
1
1
0
B A C D E Graph A B A 0 B C
1 2 3 4 C D E
D E 0 1 2 4 3 Urut abjad
REPRESENTASI GRAPH DALAM BENTUK MATRIX
Adjacency Matrix Graph berarah
0
1
0
1
0
1
0
1
0
1
0
1
0
1
1
0
0
1
0
1
0
0
0
0
0
Graph A B A 0 B C
1 2 3 4 C D E
REPRESENTASI GRAPH DALAM
BENTUK LINKED LIST
Adjency List graph tak berarah
Digambarkan sebagai sebuah simpul yang memiliki 2 pointer.
Simpul vertex : Simpul edge :
info
info
Menunjuk ke simpul vertex berikutnya,
dalam untaian simpul yang ada.
Menunjuk ke simpul
edge pertama Menunjuk ke simpul edge berikutnya, bila
masih ada. Menunjuk ke simpul
vertex tujuan yang berhubungan dengan
simpul vertex asal.
Adjacency List
Direpresentasikan dengan linked list atau array.
Array list : array dua dimensi namun tidak ber-ordo nxn.
Array Lists
2
3
1
4
5
aList[1] = (2,4)
aList[2] = (1,5)
aList[3] = (5)
aList[4] = (5,1)
Adjacency Lists (Linked List)
2 3 1 4 5 aList [1] [5] [2] [3] [4] 2 4 1 5 5 5 1 Define struct untuk sebuah simpul yang dapat digunakan sebagai vertex maupun edge.
typedef struct tipeS {
tipeS *Left;
int INFO;
tipeS *Right;
};
CONTOH : UNTUK VERTEX A, MEMILIKI 2 EDGE YANG
TERHUBUNG YAITU E1 DAN E2.
GRAPH BERARAH DAN BERBOBOT
B A C D E 5 3 2 14 12 6 7 120
5
0
2
0
6
0
3
0
0
0
0
0
0
9
0
0 12 0
7
0 14 0
0
0
A
A
0
B C
1 2 3 4
D E 0 1 2 4 3
B C D E
Metode Penelusuran
Graph Traversal : Mengunjungi tiap simpul/node secara sistematik.
Metode :
Algoritma BFS
BFS diawali dengan vertex yang diberikan, yang mana di level 0.
Dalam stage pertama, kita kunjungi semua vertex di level 1.
Stage kedua, kita kunjungi semua vertex di level 2. Disini vertex
baru, yang mana adjacent ke vertex level 1, dan seterusnya.
Langkah-langkah algoritma BFS
1) Masukkan simpul ujung (akar) ke dalam antrian
2) Ambil simpul dari awal antrian, lalu cek apakah simpul merupakan solusi 3) Jika simpul merupakan solusi, pencarian selesai dan hasil dikembalikan.
4) Jika simpul bukan solusi, masukkan seluruh simpul yang bertetangga dengan simpul tersebut (simpul anak) ke dalam antrian
5) Jika antrian kosong dan setiap simpul sudah dicek, pencarian selesai dan mengembalikan hasil solusi tidak ditemukan
Breadth First Search (BFS)
Contoh BFS
Diketahui sebuah kota, dengan memiliki inisial seperti yang ditunjukkan dibawah ini. Jarak antar kota dibentuk dengan sebuah graph
Pembahasan Contoh
Maka dengan menggunakan algoritma BFS, rute tercepat yang didapat adalah sebagai berikut:
1 – 2 – 3 – 4 – 5 – 6 – 7 – 8
1. Pertama-tama, pointer menunujuk pada daun yang ada sebelah kanan, yaitu no.2 (1 – 2)
2. Setelah itu, proses dilanjutkan pada tetangga no.2 yaitu no.3 (1-2-3) dan selanjutnya mengarah pada tetangga terdekat, yakni no.4 (1-2-3-4).
3. Pointer mencari tetangga no.4, namun karna tidak ada, maka pointer kembali ke kota no.2 dan masuk ke daun berikutnya, yakni no.5.
Depth First Search (DFS)
Pada setiap pencabangan, penelusuran verteks-verteks yang belum dikunjungi dilakukan secara lengkap pada pencabangan pertama, kemudian
selengkapnya pada pencabangan kedua, dan seterusnya secara rekursif.
Depth First Search (DFS)
….
Algoritma DFS
Traversal dimulai dari simpul
v.
Algoritma:
1.
Kunjungi simpul
v,
2.
Kunjungi simpul
w
yang bertetangga dengan simpul
v.
3.
Ulangi
DFS mulai dari simpul w.
4.
Ketika mencapai simpul
u sedemikian sehingga
semua simpul
yang bertetangga dengannya telah dikunjungi, pencarian
dirunut-balik (
backtrack)
ke simpul terakhir yang dikunjungi
sebelumnya dan mempunyai simpul
w yang belum
dikunjungi.
5.
Pencarian berakhir bila tidak ada lagi simpul yang belum
Minimum Spanning Tree (MST)
Pencarian biaya yang minimum dari suatu graph sehingga membentuk pohon .
Syarat Graph yang dapat dicari minimum spanning treenya :
a. Graph harus terhubung b. Ruasnya punya bobot c. Graph tidak berarah
Algoritma yang dipakai untuk menentukan minimum spanning tree :
Aplikasi MST / Pohon Rentangan
Minimum
Dalam aplikasinya problem ini misalnya :
Hendak direntangkan jaringan kabel listrik yang
menghubungkan sejumlah lokasi dengan panjang kabel
yang digunakan sependek-pendeknya mungkin.
Melihat pengelompokan data yang tersebar pada suatu
ruang.
Algoritma Kruskal
Himpunan sisi dari G diurutkan membesar sesuai bobot sisi tersebut.
Buat T dengan memasukan 1 sisi terpendek dari G tersebut.
Ulang (banyak sisi T = (banyak simpul G)-1)
Ambil sisi selanjutnya dari G.
Jika sisi itu tidak membuat sirkuit di T
Masukan sisi itu ke T
Algoritma solin
Algoritma Solin untuk MST merupakan kebalikan dari algoritma Kruskal,
Operasi-operasi
Menggunakan adjacency matriks, operasi-operasinya sebagai berikut :
1. Deklarasi
2. Inisialisasi
3. Penambahan node
4. Penambahan edge
5. Menandai Node
6. Traversal
Contoh Program
Deklarasi
public class AdjacencyMatriksGraph { private final int MAX_VERTS = 20; private Vertex vertexList[];
private int adjMat[][]; private int nVerts;
Contoh Program
Inisialisasi
public AdjacencyMatriksGraph() // constructor {
vertexList = new Vertex[MAX_VERTS]; // adjacency matrix
adjMat = new int[MAX_VERTS][MAX_VERTS]; nVerts = 0;
for(int j=0; j<MAX_VERTS; j++) // set adjacency for(int k=0; k<MAX_VERTS; k++) // matrix to 0 adjMat[j][k] = 0;
Contoh Program
Tambah Node
public void addVertex(char lab) {
Contoh Program
Tambah Edge
public void addEdge(int start, int end)
{
Contoh Program
Menandai Node
public int getAdjUnvisitedVertex(int v) {
for(int j=0; j<nVerts; j++)
if(adjMat[v][j]==1 && vertexList[j].wasVisited==false) return j;
DFS
public void dfs() // depth-first search { // begin at vertex 0
vertexList[0].wasVisited = true; // mark it displayVertex(0); // display it
theStack.push(0); // push it
while( !theStack.isEmpty() ) // until stack empty, {
int v = getAdjUnvisitedVertex( theStack.peek() ); if(v == -1) // if no such vertex,
theStack.pop();
else // if it exists, {
vertexList[v].wasVisited = true; displayVertex(v); // display it theStack.push(v); // push it }
} // end while
for(int j=0; j<nVerts; j++) // reset flags vertexList[j].wasVisited = false;
BFS
public void bfs() // breadth-first search { // begin at vertex 0
vertexList[0].wasVisited = true; // mark it displayVertex(0); // display it
theQueue.insert(0); // insert at tail int v2;
while( !theQueue.isEmpty() ) {
int v1 = theQueue.remove();
// until it has no unvisited neighbors
while( (v2=getAdjUnvisitedVertex(v1)) != -1 ) { // get one,
vertexList[v2].wasVisited = true; // mark it displayVertex(v2); // display it
theQueue.insert(v2); // insert it } // end while
} // end while(queue not empty) // queue is empty, so we're done
for(int j=0; j<nVerts; j++) // reset flags vertexList[j].wasVisited = false;
Contoh Program
Display Node
public void displayVertex(int v) {
Daftar Pustaka
Kadir, Abdul. 2013. Teori dan Aplikasi Struktur
Data menggunakan C++. Yogyakarta : Penerbit
ANDI
Sartaj Sahni ,
“Data
Structures & Algorithms
”,
Presentation L20-24.
Mitchell Waite,
“Data
Structures & Algorithms in