Anda di halaman 1dari 94

STRUKTUR DATA

GRAF
(GRAPH)
TEORI DASAR
Outline

Definisi-definisi pada graf

Contoh-contoh graf

Graf berarah dan tidak berarah

Graf berbobot dan tidak berbobot

Derajat simpul
Definisi Graf

Graf adalah sebuah representasi dari sekumpulan objek,


antara dua objek mungkin terkoneksi dengan sebuah busur
(link/edge).

Sebuah graf terdiri dari sebuah himpunan terbatas simpul


(node/vertex), yang biasanya dilambangkan dengan V dan
sebuah himpunan terbatas dari busur, yang biasanya
dilambangkan dengan E.
G=(V,E)
V = { v1, v2, …, vn }, |V| menyatakan jumlah simpul
E = { e1, e2, …, em }, |E| menyatakan jumlah busur

3
Contoh Graf

v1 V = {v1, v2, v3}


e2 E = {e1, e2, e3, e4, e5}
e3
e5 = { (v1,v2), (v1,v2),
e1 (v1,v3), (v2,v3),
e4 (v3,v3)
}
v2 v3

Pada graf di atas, e1 dan e2 merupakan busur paralel, e5


adalah loop.
Contoh Graf

V = { 1, 2, 3, 4 }

E = {e1, e2, e3, e4, e5, e6, e7, e8}

= { (1, 2), (2, 3), (1, 3), (1, 3),


(2, 4), (3, 4), (3, 4), (3, 3)
}

Busur e3 = (1, 3) dan e4 = (1, 3)


disebut sebagai busur ganda
(multiple edges) atau busur paralel
(parallel edges).

Busur e8 = (3, 3) disebut loop.


Definisi-definisi pada Graf (1)
Dua simpul u dan v disebut bertetangga (adjacent) jika
terdapat sebuah busur yang menghubungkan u dan v.
Contoh: simpul 1 dan 2 bertetangga, simpul 1 dan 4 tidak.

Dua busur disebut bertetangga jika keduanya terhubung ke


sebuah simpul yang sama.
Contoh: busur e1 dan e5 bertetangga.
Definisi-definisi pada Graf (2)

Jika sebuah busur e menghubungkan simpul u dan v, maka:


- Simpul u dan v insiden (incident) pada e.
- Busur e insiden pada simpul u dan v.

Contoh:
- Simpul 1 dan 2 insiden pada e1.
- Busur e6 insiden pada simpul 3 dan 4.
Jenis Graf: Berarah / Tidak Berarah

Berdasarkan jenis busur:


Graf tidak berarah Graf berarah
(undirected graph) (directed graph)

busur (A,B) = (B,A) busur (A,B) ≠ (B,A)


Jenis Graf: Berbobot / Tidak Berbobot

Berdasarkan ada dan tidak adanya bobot pada busur:


Graf tidak berbobot Graf berbobot
(unweighted graph) (weighted graph)
Derajat (Degree) dari Simpul

Derajat dari sebuah simpul v, yaitu d(v), pada sebuah graf


G menyatakan jumlah dari busur yang insiden pada v.
Contoh :
d(1) = 3
d(2) = 3

Sementara itu, d(3) = 7;


e8 dihitung 2, karena kedua ujungnya
Insiden pada simpul 3.

Pada setiap graf berlaku: |d| = 2 * |E|


Derajat Simpul pada Graf Berarah

Ada dua jenis derajat pada graf berarah, yaitu:


– In-degree, din (v), yang menyatakan jumlah busur yang
menuju v.
– Out-degree, dout (v), yang menyatakan jumlah busur
yang keluar dari v.

Contoh:
d(A)=din(A)+ dout(A) = 1+3 = 4
d(C)=din(C)+ dout(C) = 3+3 = 6
Graf Sederhana dan Multigraf

Graf sederhana (simple graph): tidak memiliki busur


paralel dan loop
Multigraf (multigraph): memiliki busur paralel atau loop
Contoh:

Multigraf
Graf sederhana
Graf Lengkap

Graf lengkap adalah graf sederhana, tidak berarah, dan


untuk setiap simpul berlaku d(v) = |V| - 1

Pada sebuah graf lengkap berlaku:


|E| = |V| * (|V| - 1) / 2

Contoh:
Jumlah simpul: |V| = 7
Setiap simpul v: d(v)= 6
Jumlah busur:|E| = 21
Path, Closed Path, Circuit (1)

Path: sekuens simpul dan busur yang dimulai dari simpul


asal ke simpul tujuan, setiap simpul dan busur hanya
dikunjungi satu kali.

Contoh: S – e10 – A – e1 – B – e4 – D – e6 – T
Panjang: 4, yaitu sebanyak busur yang dilalui
Path, Closed Path, Circuit (2)

Closed Path: sekuens simpul dan busur yang dimulai dari


sebuah simpul dan kembali ke simpul tersebut. Setiap
simpul, kecuali simpul asal, dan busur hanya dikunjungi
satu kali.

Dengan kata lain, closed path adalah path dengan simpul


asal = tujuan

Contoh:
S – e10 – A – e1 – B – e4 – D – e7 – C – e9 – S
Path, Closed Path, Circuit (2)

Circuit: sekuens simpul dan busur yang dimulai dari sebuah


simpul dan kembali ke simpul tersebut. Simpul boleh
dikunjungi beberapa kali, busur hanya boleh dikunjungi satu
kali.

Contoh: A – e1 – B – e4 – D – e7 – C – e3 – B – e2 – A
TERIMA
KASIH
STRUKTUR DATA

GRAF
(GRAPH)
TOPOLOGICAL
SORT
Topological Sort
• Toposort atau topological ordering, merupakan urutan linier
simpul pada graf berarah yang asiklik.
• Graf asiklik: graf yang tidak mengandung sirkuit berarah

Graf asiklik
(acyclic graph)

Graf siklik (cyclic graph)


BCED membentuk sirkuit

• Contoh aplikasi:
Urutan tugas yang harus dikerjakan secara terurut dan terdapat
konstrain bahwa tugas tertentu harus dikerjakan sebelum tugas-tugas
lainnya. Dalam hal ini tugas direpresentasikan sebagai simpul graf.
Eksekusi Topological Sort (1)
• Misalnya akan dilakukan topological sort untuk graf berikut ini:

• Pada setiap setiap tahap:


1. Pilih sebuah simpul dengan in-degree = 0. Pada tahap awal, yang
memenuhi syarat adalah A atau G. Misalkan dipilih A.
2. Hapus semua busur dari A. Hal ini mungkin menyebabkan in-
degree simpul-simpul tersisa menjadi 0.
3. Ulangi tahap 1 dan 2 sampai tidak ada lagi simpul yang bisa
diproses.
Eksekusi Topological Sort (2)

Antrian: {A,G} Antrian: {G,B} Antrian: {B} Antrian: {C,D}


Visited: {} Visited: {A} Visited: {A,G} Visited: {A,G,B}
(1) (2) (3) (4)

Antrian: {D} Antrian: {E} Antrian: {F}


Visited: {A,G,B,C} Visited: {A,G,B,C,D} Visited: {A,G,B,C,D,E}
(5) (6) (7)

(8) Status akhir: Antrian:{},Visited: {A,G,B,C,D,E,F}


STRUKTUR DATA

GRAF (GRAPH)
Bread First Search
(DFS)
Pengantar BFS
Perhatikan graf di bawah ini

Problem 1: menampilkan semua simpul, dimulai dari 4. BFS akan


menampilkan urutan simpul: 4 1 2 5 10 9 6 3 8 7

Problem 2: mencari simpul 6, dimulai dari 3. BFS akan


mengunjungi simpul dengan urutan: 3 5 8 10 1 4 6
Cara Kerja BFS
BFS adalah sebuah algoritma untuk melintasi seluruh simpul atau mencari simpul
tertentu pada graf atau tree, dimulai dari sebuah simpul tertentu (atau dari simpul
akar jika tree). BFS memprioritaskan simpul-simpul tetangga (atau simpul-simpul
anak jika tree) untuk dieksplor sebelum simpul-simpul lainnya.

BFS menggunakan antrian untuk menyimpan simpul-simpul tetangga dari simpul


yang sedang diproses.

Contohnya, jika simpul 4 sedang diproses,


maka simpul 1, 2, 5, 10 masuk ke dalam
antrian.

BFS selesai jika status semua simpul ‘visited’


atau jika simpul yang dicari sudah ditemukan.
Algoritma BFS

Procedure BFS ( G : graph, v : vertex )


Kamus
Q : Queue
x, w : vertex
Algoritma
enqueue( Q, v )
while ( not isEmpty( Q ) ) do
x  dequeue(Q)
if( not isVisited( x ) ) then
visit( x )
for all neighbors w of x do
if( not isVisited( w ) then
enqueue( Q, w )
Melintasi Graf dengan BFS
Di bawah ini adalah ilustrasi penelusuran graf dengan BFS. Penelusuran simpul dengan
DFS dimulai dari simpul 4.

Penelusuran akan berakhir di simpul 7.


Pencarian dengan Algoritma BFS
Di bawah ini adalah ilustrasi pencarian simpul F dengan simpul awal D.

Simpul yang dikunjungi: D B G E H C F


STRUKTUR DATA

GRAF
(GRAPH)
Depth First Search
(DFS)
Pengantar DFS
Perhatikan graf di bawah ini

Problem 1: menampilkan semua simpul, dimulai dari 4. DFS


akan menampilkan urutan simpul: 4 1 5 3 8 6 2 9 7 10
Problem 2: mencari simpul 6, dimulai dari 3. DFS akan
mengunjungi simpul dengan urutan: 3 5 1 4 2 6
Cara Kerja DFS
DFS adalah sebuah algoritma untuk melintasi seluruh simpul atau mencari simpul
tertentu pada graf atau tree, dimulai dari sebuah simpul tertentu (atau dari simpul
akar jika tree). DFS akan mengeksplor sebuah simpul tetangga (atau sebuah cabang
jika tree) sejauh mungkin sebelum backtracking.

DFS menggunakan stack untuk menyimpan simpul-simpul tetangga dari simpul yang
sedang diproses.

Contohnya, jika simpul 4 sedang diproses,


maka simpul 1, 2, 5, 10 masuk ke dalam stack.

DFS selesai jika status semua simpul ‘visited’


atau jika simpul yang dicari sudah ditemukan.
Algoritma DFS

Procedure DFS (G : graph, v : vertex )


Kamus
S : Stack
x, w : vertex
Algoritma
push( S, v )
while ( not isEmpty( S ) ) do
x  pop(S)
if( not isVisited( x ) ) then
visit( x )
for all neighbors w of x do
if( not isVisited( w ) then
push( S, w )
Melintasi Graf dengan DFS
Di bawah ini adalah ilustrasi penelusuran graf dengan DFS. Penelusuran simpul dengan
DFS dimulai dari simpul 4 dan berakhir di simpul 10.

Panah berwarna merah adalah


backtracking.
Pencarian dengan Algoritma DFS
Di bawah ini adalah ilustrasi pencarian simpul F dengan simpul awal D.

Simpul yang dikunjungi: D B E H G C F


TERIMA
KASIH
STRUKTUR DATA

GRAF
(GRAPH)
Representasi Graf
Matriks Ketetanggaan (1)
Untuk graf G dengan N simpul, maka matriks ketetanggaan untuk G
berukuran N x N.
Untuk graf tidak berbobot dan tidak berarah, elemen ke-[i,j] menyatakan
banyaknya busur yang menghubungkan simpul vi dan vj.
Contoh matriks ketetanggaan untuk graf tidak berarah dan tidak berbobot.

Perhatikan, untuk graf tidak berarah


matriks simetris

2
Matriks Ketetanggaan (2)
• Contoh matriks ketetanggaan untuk graf berarah dan
tidak berbobot.
• Elemen ke-[i,j] menyatakan banyaknya busur dari
simpul vi ke vj.
Matriks Ketetanggaan (3)
• Untuk graf berbobot, matriks ketetanggaan
menyimpan bobot dari busur.
• Contoh matriks ketetanggaan untuk graf berarah dan
berbobot.
- Elemen ke-[i,j] menyatakan bobot busur dari
simpul vi ke vj.
2
3
2
2 5
1 5
1 3

3 7
1
2 4
4 3
6
Matriks Insiden (1)
• Matriks insiden merepresentasikan hubungan antara simpul
dengan busur.
• Untuk graf G dengan N simpul dan M busur, maka matriks
insiden untuk G berukuran N x M.
• Contoh matriks insiden untuk graf tidak berarah.
Elemen [i,j]=1 artinya busur ej insiden pada simpul vi.
e e e e e e e e e e
Matriks Insiden (2)
• Contoh matriks insiden untuk graf berarah.
• Elemen [i,j]= -1 menyatakan busur ej keluar dari simpul
vi.
Elemen [i,j]= 1 menyatakan busur ej menuju simpul vi.
Elemen [i,j]= 0 menyatakan busur ej tidak insiden
pada simpul vi. e e e e e e
Matriks Insiden (3)
• Contoh matriks insiden untuk graf berbobot.
• Elemen [i,j] negatif menyatakan bobot busur ej yang
keluar dari simpul vi.
Elemen [i,j positif menyatakan bobot busur ej yang
menuju simpul vi.
e e e e e e
10

20
12
7
60
32
Array of Linked-List
• Kekurangan representasi matriks: mungkin terjadi
sparse matrix dimana elemen 0 sangat dominan pada
matriks.
• Alternatif representasi: array of linked-list. Contoh

ADT
type address: pointer to vertex
type graph: array[‘A’..’G’] of address
type vertex: <destVertexID: char, Ukuran array adalah N =
weight: integer, jumlah simpul
next: address>
Array of Linked-List (1)
• Kekurangan representasi matriks: mungkin terjadi
sparse matrix dimana elemen 0 sangat dominan pada
matrix.
• Alternatif representasi: array of linked-list. Contoh:

Ukuran array adalah N =


jumlah simpul
Array of Linked-List (2)
• Kekurangan representasi matriks: mungkin terjadi
sparse matrix dimana elemen 0 sangat dominan pada
matrix.
• Alternatif representasi: array of linked-list. Contoh:
ADT
type address: pointer to vertex
type graph: array[‘A’..’E’] of address
type vertex: <destVertexID: char,
weight: integer,
next: address>
Array of Linked-List (3)
• Contoh algoritma untuk array of linked-list: inisialisasi array

ADT
type address: pointer to vertex
type graph: array[‘A’..’E’] of address
type vertex: <destVertexID: char,
weight: integer,
next: address> procedure initGraph (input/output G:graph)
{I.S. –
F.S. G[i]=nil untuk i=’A’ sampai ‘E’}

dictionary
i:char
algorithm
i  ‘A’
while i < ’E’ do
G[i]  nil
i  i+1
{endwhile, i > ’E’}
Array of Linked-List (4)
Contoh algoritma untuk array of linked-list: menambahkan sebuah busur
procedure add1Edge (input/output G:graph,
input source, dest: char,
input weight:integer)
{I.S. terdefinisi G sebuah graf, vertex
bernama source dan dest, dan weight.
F.S. edge berbobot weight dari source ke
dest sudah ditambahkan ke graf G}

dictionary
newP :address
algorithm
{insert first}
allocate(newP)
destVertexID(newP)  dest
weight(newP)  weight
next(newP)  G[source]
G[source]  newP
Multi Linked-List (1)
• Multi linked-list memungkinkan untuk
merepresentasikan graf tanpa dibatasi jumlah simpul.
Contoh:
Multi Linked-List (2)
• Multi linked-list memungkinkan untuk
merepresentasikan graf tanpa dibatasi jumlah simpul.
Contoh:
Elemen paling kiri menyatakan simpul

ADT
type adrVertex: pointer to vertex
type adrEdge: pointer to edge
type vertex: <id: char,
next: adrVertex,
firstEdge: adrEdge>

Elemen lainnya menyatakan busur

type edge: <idVertex: char,


weight: integer,
next: adrEdge>
Multi Linked-List (3)
Contoh algoritma untuk array of linked-list: menambahkan sebuah busur
procedure add1Edge (input/output G:graph,
input pSource: adrVertex,
input dest: char, input
weight:integer)
{I.S. terdefinisi G sebuah graf, simpul
asal beralamat pSource, indeks
simpul tujuan dest, dan weight.
F.S. edge berbobot weight dari source ke
dest sudah ditambahkan ke graf G}
dictionary
newP :address
algorithm
{insert first}
allocate(newP)
destVertexID(newP)  dest
weight(newP)  weight
next(newP)  firstEdge(pSource)
firstEdge(pSource)  newP
Contoh Algoritma (4)
• Dengan multi-linked list ini jumlah simpul tidak
dibatasi.
• Untuk menambahkan busur baru mungkin perlu
menambahkan simpul terlebihMisalnya
dahulu.
akan ditambahkan sebuah
busur baru (E, F), maka simpul baru F
harus ditambahkan terlebih dahulu.

1
Elemen baru
Review Materi Sebelumnya
• Multi linked-list memungkinkan untuk
merepresentasikan graf tanpa dibatasi jumlah simpul.
Contoh:
ADT
• Graf juga dapat direpresentasikan dengan multi linked-
list berikut ini
ADT
• Graf juga dapat direpresentasikan dengan multi linked-
list berikut ini

ADT
type adrVertex: pointer to vertex Untuk graf berbobot, definisi edge:
type adrEdge: pointer to edge type edge: <vertex_1: adrVertex,
type vertex: <id: char, vertex_2: adrVertex,
nextVertex: adrVertex> weight: integer,
type edge: <vertex_1: adrVertex, nextEdge: adrEdge>
vertex_2: adrVertex,
nextEdge: adrEdge>
type listOfVertex: <firstVertex: adrVertex>
type listOfEdge: <firstEdge: adrEdge>
Contoh Algoritma (1)
• Contoh algoritma: menampilkan semua simpul tetangga simpul v.

procedure getNextVertices(input v: adrVertex,


edgeList:listOfEdge)
{I.S. Vertex v tidak nil; edgeList tidak kosong.
F.S. Semua tetangga v sudah ditampilkan. }
dictionary
p : adrEdge
algorithm
p  firstEdge(edgeList)
while p<> nil do
if vertex_1(p)=v then
output(id(vertex_2(p))
else if vertex_2(p)=v then
output(id(vertex_1(p))
endif
p  next(p)
{endwhile, p=nil}
Contoh Algoritma (2)
• Dengan multi-linked list ini jumlah simpul tidak
dibatasi.
• Untuk menambahkan busur baru mungkin perlu
menambahkan simpul terlebih dahulu.
• Misalnya akan ditambahkan sebuah busur baru (E, F),
maka simpul baru F harus ditambahkan terlebih
dahulu. Perhatikan ilustrasi berikut: 1
Elemen baru
2
TERIMA
KASIH
GRAF
MK STRUKTUR DATA
KODE DOSEN : FSV
S1 INFORMATIKA, FAKULTAS INFORMATIKA, TELKOM UNIVERSITY
VERSI Genap 2019/2020
Definisi Graf

Graf G = (V, E), yang dalam hal ini:


V = himpunan tidak-kosong dari simpul-simpul
(vertices/node)
= { v1 , v2 , ... , vn }
E = himpunan sisi/busur (edges) yang menghubungkan
sepasang simpul
= {e1 , e2 , ... , en }
2
Definisi Graf

v1  V = {v1, v2, v3}


e2
e3
e5  E = {e1, e2, e3, e4, e5}
e1
= {(v1,v2), (v1,v2),
e4
(v1,v3), (v2,v3),
v2 v3 (v3,v3)}
Definisi Graf
V = { 1, 2, 3, 4 }
E = {(1, 2), (2, 3),
(1, 3), (1, 3), (2, 4),
(3, 4), (3, 4), (3, 3)}
= { e1, e2, e3, e4, e5, e6, e7, e8}
 sisi e3 = (1, 3) dan sisi e4 = (1, 3)
dinamakan sisi-ganda (multiple edges atau
paralel edges)
 sisi e8 = (3, 3)
dinamakan gelang atau kalang (loop)
Jenis Graf

Berdasarkan ada tidaknya gelang atau


sisi ganda pada suatu graph, maka
graph digolongkan menjadi dua jenis:

1. Graph sederhana (simple graph).


2. Graph tak-sederhana (unsimple-
graph).
Jenis Graph

Berdasarkan orientasi arah pada sisi,


maka secara umum graph
dibedakan atas 2 jenis:
1. Graph tak-berarah
(undirected graph)
2. Graph berarah (directed graph
atau digraph)
Ketetanggan dan insidensi

Dua buah simpul dikatakan bertetangga bila keduanya


terhubung langsung. Secara formal v1 bertetangga
(adjacent) dengan v2 jika  e  E sedemikian sehingga
e=(v1,v2).

Untuk e=(vj,vk) maka e bersisian (incident) dengan vj dan


e bersisian dengan vk.
Derajat : banyaknya sisi yang bersisian dengan simpul tersebut

din(v1)=1, dout(v1)=1, d(v1)=2


d(v1) = d(v2) = 3, d(v3)=4, d(v4)=0 din(v2)=0, dout(v2)=2, d(v1)=2
din(v3)=3, dout(v2)=1, d(v2)=4
Matrik Ketetanggan
Matriks Bersisian
Graph Tak Graph
Berarah Berarah
List Ketetanggan

 Node : menyimpan informasi

 Edge : Menghubungkan dua buah node.


List Ketetanggan Graph tak berarah
Edge bisa berbentuk panah satu arah
Bisa juga berbentuk panah dua arah
Contoh Graph Tidak Berarah menggunakan Multi
Linked List 1 ke N dengan info
Contoh Graph Tidak Berarah menggunakan
Multi Linked List 1 ke N dengan Pointer
Contoh Graph Berarah menggunakan Multi
Linked List 1 ke N dengan info
Contoh Graph Berarah menggunakan
Multi Linked List 1 ke N dengan pointer
Pembentukan Graph Tidak Berarah Menggunakan
Multi Linked List 1 ke N versi info

START

B C

D
Operasi Hapus Node dan Edge

START

B C

D
ADT Graph MLL 1 ke N Versi Info

 List Parent menyimpan data Node


yang ada di Graph
 List Child menyimpan tetangga dari
Node pada Parent berbentuk Info
Contoh :
 Pada graph terlihat terdapat 4 Node
yaitu A, B, C, dan D. Maka elemen list
parent terdiri dari A, B, C, dan D
 Pada graph terlihat Node B
bertetangga dengan Node A dan D,
maka elemen child dari elemen
parent B adalah A dan D
 Deklarasi Struktur Data Graph

Type InfotypeNode : ………….


Type InfotypeEdge : ………….
Type adrNode : pointer to elmtNode
Type adrEdge : pointer to elmtEdge
Type elmtNode : < Info : infotypeNode,
firstEdge : adrEdge,
nextNode : adrNode>
Type elmtEdge : < Info : infotypeEdge,
nextEdge : adrEdge>
Type Graph : < Start : adrNode>
ADT Graph MLL 1 ke N Versi Info
Primitf yang dibutuhkan untuk membentuk ADT Graph adalah :
 Create Graph : Me-NULL-kan pointer Start
 Alokasi Node : alokasi elemen parent
 Alokasi edge : alokasi elemen child
 Add New Node : Insert Last List Parent
 FindNode : mencari alamat node tertentu
 Insert Last Edge : meng insertkan elemen edge menjadi anak terkahir dari elemen parent tertentu
 Connecting two nodes / add edge : Insert Last Child pada 2 elemen parent yang saling terhubung
 deleteEdge : menghapus elemen child/edge, bisa jadi edge di first, di akhir, atau diantara edge (after)
 Disconnecting/delete edge: Delete 2 elemen child dari 2 Elemen parent (2 node yang terputus). Posisi
elemen child bisa di First, akhir, atau diantara elemen.
 Delete Node : Menghapus elemen parent, dan menghapus elemen child yang berisi info node yang di
delete dari semua parent. Posisi elemen parent maupun child bisa di First, akhir, atau diantara elemen.
 ShowTetangga : menampilkan node tetanga dari setiap node yang ada pada graph
Create Graph, Alokasi Node, Alokasi Edge
Procedure createGraph(in/out G : Graph)
Algoritma
Start(G) NULL

Function alokasiEdge (infoEdge : infotypeEdge)→ adrEdge


Kamus
P : adrEdge
Algoritma
Pnew elmtEdge
Info(P)infoEdge
nextNodeNULL
→P
Add New Node (Insert Last Parent)

Procedure addNewNode (In/Out G : Graph, In P : adrNode) START


Kamus
Q : adrNode A B
Algoritma
If (Start(G) =NULL) then
Srtart(G) P
Else
QStart(G)
While(nextNode(Q) != NULL) do
QnextNode(Q)
nextNode(Q)P Setelah node baru di add
START

Connecting A B

C D
Tahapan menghubungan dua
buah node dengan sebuah edge
 Mencari lokasi node yang
akan dikoneksikan di list
parent. Misal Node D akan P1
dihubungkan dengan Node B. P2
 Kemudian, alokasi Elemen
edge yang berisi info node
yang akan disambungkan.
Misal Node D akan
dihubungkan dengan Node B.
Maka kita harus membuat 2
elemen edge yang infonya D
dan B
 Kemudian melakukan insert
Last elemen edge dengan
info B di node D. Begitu juga
dengan edge dengan info D
di node B.
Fungsi Prosedur proses Connecting

FindNode
InsertLastEdge
Find Node

Function findNode(G : Graph, data : infotypeNode)→ adrNode


Kamus
P : adrNode
Algoritma
If(Start(G) = NULL) then
→ NULL
Else
PStart(G)
While(infoNode(P)!=data) AND (nextNode(P) != NULL) do
QnextNode(Q)
If(infoNode(P)=data) then
→P
Else
→ NULL
Insert Last Edge pada Parent tertentu
Procedure insertLastEdge(In/Out G : Graph, In PNode : adrNode, PEdge: adrEdge)
Kamus
P : adrNode
Algoritma
If (Pnode=NULL) then
Output(“Node tidak ditemukan”)
Else if (firstEdge(Pnode) = NULL) then
firstEdge(Pnode)PEdge P
Else
P firstEdge(Pnode)
While (nextEdge(P) != NULL) do
PnextEdge(P)
nextEdga(P)PEdge
START

Connecting A B

C D
Procedure connecting(In/Out G : Graph,
In node1, node2: char) //Node 1 : B,
Kamus //Node 2: D
E1,E2, Q: adrEdge
P1,P2 : adrNode P1 P2
Algoritma
P1FIndNode(G,node1)
P2FIndNode(G,node2)
If (P1!=NULL AND P2!=NULL) then
E1alokasiNode(node2)
insertLastEdge(G,P1,E1)
E2alokasiNode(node1)
insertLastEdge(G,P2,E2)
Else
Output(“Node tidak ditemukan”)
Disconnecting START

A B

Tahapan disconnecting
node 1 dengan node 2 : C D
 Mencari lokasi node 1
dan node 2. Misal Node 1
= B, Node 2 = D
P1 P2
 Lalu mencari pada anak
node 1 edge yang berisi
info node 2. Lalu lakukan
delete edge
E2
 Lalu mencari pada anak
node 2 edge yang berisi
info node 1. Lalu lakukan
delete edge E1
Fungsi Prosedur proses Disconnecting

FindNode (sudah ada di slide sebelumnya)


FIndEdge
DeleteEdge
DeleteFirstEdge
DeleteLastEdge
DeleteAfterEdge
FindEdge

Function findEdge(G : Graph, Pnode : adrNode, data : char)→ adrEdge


Kamus
P : adrEdge
Algoritma
If Start(G) or Pnode=NULL then
→ NULL
Else
PfirstEdge(Pnode)
While (info(P) != data) AND (nextEdge(P) != NULL) do
PnextEdge(P)
If( info(P) = data) then
→P
Else
→ NULL
Delete First Edge

Procedure deleteFirstEdge(In/Out G : Graph, In Pnode : adrNode, Out P : adrEdge)


Kamus
Algoritma
If Start(G)=NULL then
Output (“EMPTY”)
Else
PfirstEdge(Pnode)
firstEdge(Pnode)nextEdge(P)
nextEdge(P)NULL
Delete Last Edge

Procedure deleteLastEdge(In/Out G : Graph, In Pnode : adrNode, Out P : adrEdge)


Kamus
Q: adrEdge
Algoritma
If Start(G)=NULL then
Output (“EMPTY”)
Else
QfirstEdge(Pnode)
While (nextEdge(Q)!=NULL) do
QnextEdge(Q)
PnextEdge(Q)
nextEdge(Q)NULL
Delete After Edge

Procedure deleteAfterEdge(In/Out G : Graph, In Pnode : adrNode, In Prec : adrEdge, Out P :


adrEdge)
Kamus
Algoritma
PnextEdge(prec)
nextEdge(prec)nextEdge(P)
nextEdge(P)NULL
Delete Edge (Child)

 Delete Edge Procedure deleteEdge(In/Out G : Graph, In Pnode : adrNode, In Pedge :


adalah proses adrEdge)
menghapus Kamus
edge yang Eout,prec : adrEdge
sudah Algoritma
diketahui If(Pedge=firstEdge(Pnode) then // deleteFirst
alamatnya. deleteFirstEdge(Pnode,Eout)
 proses delete Else if (next(Pedge)=NULL) then //deleteLast
bisa first, last deleteLastEdge(Pnode,Eout)
atau after Else //deleteAFter
tergantung precfirstEdge(Pnode)
posisi edge while (nextEdge(prec)!=Pedge) do
yang dihapus
prec nextEdge(prec)
deleteAFterEdge(G,Pnode,prec, Eout)
Disconnecting
Procedure Disconnecting(In/Out G : Graph, In Node1, Node2: char)
Kamus
N1, N2 : adrNode
E1,E2,Eout : adrEdge
Algoritma
N1FIndNode(G,Node1)
N2FIndNode(G,Node2)

If(N1 != NULL AND N2 != NULL) then


E1findEdge(G,N1, Node2)
E2findEdge(G,N2, Node1)
If( E1 !=NULL AND E2 != NULL) then
deleteEdge(G,N1,E1,Eout)
deleteEdge(G,N2,E2,Eout)
Else
output(“Edge Tidak ditemukan”)
Else
output(“Node Tidak ditemukan”)
Show Tetangga
Procedure Show (G : Graph)
Kamus
N : adrNode
E : adrEdge
Algoritma
If (Start(G) != NULL) then
NStart(G)
Output(“Node”, info(N), “ tetangganya : “)
While(N != Null) do
EfisrtEdge(N)
While (E!=NULL) do
output(info(E))
EnextEdge(E)
NnextNode(N)
Else
Output(“Graf Kosong”)
Latihan

 Buatlah function yang menghitung jumlah degree dari sebuah Node pada graph tidak
berarah
Function hitungDegree(G: Graph, node: char)→integer
 Buatlah Procedure yang mengoutputkan jumlah degree dari setiap node yang ada di
Graph
Procedure showDegree(In G : Graph)
{Anda bisa memanfaatkan Function hitungDegree di atas}
 Buatlah function yang menghitung berapa node loop yang terjadi pada sebuah graph
Function loop(G: Graph)→ integer
Latihan

 Terdapat sebuah Graph berarah dan bentuk ketetanggan list nya

Buatlah Fungsi dan procedure berikut ini :


 AddNewNode
 Connecting
 Disconnecting

Anda mungkin juga menyukai