Anda di halaman 1dari 11

5/22/2010

Algoritma Graph
• Algoritma traversal di dalam graf adalah
mengunjungi simpul-simpul dengan cara yang
Algoritma BFS dan DFS sistematik.
• Pencarian Melebar (Breadth First Search atau
BFS),
wijanarto
• Pencarian Mendalam (Depth First Search atau
DFS).

Pencarian Melebar
Graph Searching Algorithm
(Breadth First Search atau BFS)
• Idenya mirip dengan algo prim dan dijkstra • Pencarian Sistemik pada setiap edge dan
• Traversal dimulai dari simpul v. vertek dari graph G
• Algoritma: • Graph G=(V,E), directed atau undirected
– Kunjungi simpul v,
– Kunjungi semua simpul yang bertetangga dengan simpul v
• Aplikasi
terlebih dahulu. – Compiler
– Kunjungi simpul yang belum dikunjungi dan bertetangga – Graphics
dengan simpul-simpul yang tadi dikunjungi, demikian – Maze
seterusnya.
– Mapping
• Jika graf berbentuk pohor berakar, maka semua simpul pada
– Network : routing,searching,clustering, dsb
aras d dikunjungi lebih dahulu sebelum simpul-simpul pada
aras d + 1.

Representasi BFS Contoh bfs


• Pada umumnya graf di representasikan baik r s t u r s t u
secara array ataupun list ∞ 0 ∞ ∞ ∞ 0 ∞ ∞
Q s Q s
• Dalam kuliah ini menggunakan Link LIST dan ∞ ∞ ∞ ∞
0
∞ ∞ ∞ ∞ 0

queue v w x y v w x y

struct node {
r s t u r s t u
int data; 1 0 ∞ ∞ 1 0 2 ∞
Q w r Q r t x
struct node *link; 1 1 1 2 2
∞ 1 ∞ ∞ 2 1 2 ∞
}; v w x y v w x y

1
5/22/2010

Contoh bfs Contoh bfs


r
1
s
0
t
2
u

r
1
s
0
t
2
u
3
• 1,2,3 adalah label vertek dalam G
Q t x v Q x v u
2 2 2 2 2 3
• 1 merupakan panjang shortest path dari s
2 1 2 ∞ 2 1 2 ∞
(source)Æ(s-w,s-r) r s t u
v w x y v w x y 1 0 2 3
– 2 berarti
b ti ada
d 2 edge
d
• (s-t,s-x,s-v) 2 1 2 3
r s t u r s t u
1 0 2 3
– 3 berarti ada 3 edge v w x y
1 0 2 3
Q v u y Q u y • (s-u,s-y)
3 3 3 2 1 2 3 3 3
2 1 2 3
v w x y v w x y

Bfs secara grafikal


0
A B C D
0
A
1
B C D
Bfs secara grafikal
E F G H E F G H
0 1 2 3
0 1 2 3
A B C D
A B C D
I J K L I J K L
E F G H
E F G H
M N O P M N O P 4 4
0 1 2 0 1 2 3 I J K L
A B C D A B C D I J K L

M N O P
E F G H E F G H M N O P 5

I J K L I J K L

M N O P M N O P

Algoritma bfs 1 Algoritma bfs 2


BFS (G, s)
For each vertek u∈V[G] –{s} do
color[u]Åputih Bfs(v){
INIT semua
d[u]Å∞ {tdk di labeli} VERTEK QÅ∅;
pi[u]Ånil {predesesor vertek} mark[v]Å visited;
Color[s]Åabu2
QÅenqueue(v);
D[s]Å0 INIT BFS
Pi[s]Ånil dengan s while Q≠∅ do {
QÅ{s} (source) uÅ first(Q)
While Q≠o do dequeue(u)
uÅhead[Q] Tangani for w adj pada u do {
for each u ∈ adj[u] do seluruh anak s
if color[v]Åputih then SEBELUM
if mark[w]≠ visited then
color[v]Åabu2 menangani mark[w]Åvisited
d[v]Åd[u]+1 anak dari QÅEnqueue (w)
pi[v]Åu anaknya
}
ENQUEUE(Q,v)
DEQUEUE(Q) }
color[u]ÅHitam }

2
5/22/2010

Algoritma Dalam List (1) Algoritma Dalam List (2)


void BFS(VLink G[], int v) { void TRAVEL_BFS(VLink G[],int visited[],int n) {
int w; VISIT(v); /*visit vertex v*/
visited[v] = 1; /*tandai v, telah di kunjungi dengan : 1 */ int i;
ADDQ(Q,v); /* Inisialisasi seluruh vertek
while(!QMPTYQ(Q)) {
v = DELQ(Q); /*Dequeue v*/
dengan visited[i] = 0 */
w = FIRSTADJ(G,v);/*cari tetangga pertama, return -1 if tidak ada */ for(i = 0; i < n; i ++) {
while(w != -1) {
visited[i] = 0;
if(visited[w] == 0) {
VISIT(w); /*visit vertex v*/ }
ADDQ(Q,w); /*Enqueue vertek yang sedang di kunjungi w*/ /* Lakukan BFS ke seluruh vertek dlm G*/
visited[w] = 1; /*tandai w telah di kunjungi*/
} for(i = 0; i < n; i ++)
/*cari tetangga selanjutnya, return -1 if tidak ada*/ if(visited[i] == 0) BFS(G,i);
w = NEXTADJ(G,v);
}
}
}
}

BFS
Kegunaan BFS
Properti dan running time
• O(V+E) • Memerikasa apakah graph terhubung
• G=(V,E), bfs mencari seluruh vertek yg dapat di
raih dari source s • menghitung spanning forest graph
• Untuk setiap vertek pada level I, path bfs tree • Menghitung, tiap vertex dlm graph, jalur dg
antara s dan v mempunyai I edge dan selain path j l h edge
jumlah d minimum
i i antara vertex awall d
dan
dlm G antara s dan v setidaknya mempunyai i
edge current vertex atau ketiadaan path.
• Jika (u,v) adalah edge maka jumlah level u dan v • Menghitung cycle dlm graph atau ketiadaan
di bedakan setidaknya satu tingkat cycle.
• Bfs menghitung seluruh jarak terpendek ke
seluruh vertek yang dapat di raihnya. • O(V + E).

Algoritma BFS dg matrik 1 Algoritma BFS dg matrik 2


void buildadjm(int adj[][MAX], int n) { struct node *addqueue(struct node *p,int val) {
struct node *temp;
int i,j; if(p == NULL) {
printf("enter adjacency matrix \n",i,j); p = (struct node *) malloc(sizeof(struct node));
/* insert the new node first node*/
for(i=0;i<n;i++) if(p == NULL) { printf("Cannot allocate\n"); exit(0); }
for(j=0;j<n;j++) p->data
p >data = val; p->link=NULL;
p >link NULL;
} else {
scanf("%d",&adj[i][j]); temp= p;
} while(temp->link != NULL) { temp = temp->link; }
temp->link = (struct node*)malloc(sizeof(struct node));
temp = temp->link;
if(temp == NULL) { printf("Cannot allocate\n"); exit(0); }
temp->data = val; temp->link = NULL;
}
return(p);
}

3
5/22/2010

Algoritma BFS dg matrik 3 Algoritma BFS dg matrik 4


struct node *deleteq(struct node *p,int *val) { void bfs
(int adj[][MAX],int x,int visited[],int n, struct node **p){
struct node *temp;
int y,j,k;
if(p == NULL) { *p = addqueue(*p,x);
printf("queue is empty\n"); do{ *p = deleteq(*p,&y);
return(NULL); if(visited[y] == 0){
printf("\nnode visited = %d\t",y);
}
visited[y] = 1;
*val = p->data; for(j=0;j<n;j++)
temp = p; if((adj[y][j] ==1) && (visited[j] == 0))
p = p->link; *p = addqueue(*p,j);
}
free(temp);
}while((*p) != NULL);
return(p); }
}

Contoh pada Matrik 9X9 Contoh lain


node visited = 0
123456789 0 • Awal simpul adalah V1, dari graf G di bawah
1 010010000 node visited = 1
2 101100000
node visited = 4 • Kunjungan BFS menghasilkan :
1 4 node visited = 2
3 010000100 node visited = 3 • v1,v2,v5,v3,v4,v7,v6,v8,v9
4 010011000 2 3 node visited = 6
5 100100000 node visited = 5
6 000100001 node visited = 7
6 5
node visited = 8
7 001000011
8 000000100 7 8
9 000001100

Aplikasi bfs Aplikasi bfs


(connected component) (connected component)
1
• 1 2 3
3 • Inisialkan seluruh Vertek dlm G dengan 0
1 • Mulai dari sembarang vertek dengan nilai 0 dalam CC lalu
3 lakukan bfs
2
1 3
1 2
• Cari vertek dg nilai 0 selanjutnya dan lakukan bfs lagi
1 1
1 3
5 4 a b g 2 3

1
3
v c 2
1 i h 3
No CC 1 1 1 2 2 2 5 4 3 3 3 e 1
f 1 2
d
5 4
• Jika ada label yang elemennya sama berarti
terdapat CC dan Sebaliknya d g a h b f i e c

• BAGAIMANA KITA MEMBUATNYA ?? No CC 1 2 1 2 1 0 1 2 1 0 1

4
5/22/2010

Aplikasi bfs Aplikasi bfs


(connected component) (Bipartite graph )
• Running Time = O(m+n) • Bipartite graph : undirected graph G = (V, E)
• M= # edge dimana V dapat di bagi menjadi 2 himpunan
• N=scanning array untuk mecari CC
V1 dan V2 sehingga (u, v) menyebabkan baik u
• Terdapat m saat kita melakukan bfs, sekaligus n saat melabeli
CC dalam
d l array ∈V1 dan v ∈ V2 atau u ∈ V2 dan v ∈ V1.
Sehingga seluruh edge ada diantara 2
himpunan V1 dan V2.

Algoritma Bipartite Graph


ALGORITHM: BIPARTITE (G, S)
For each vertex U ∈ V[G] - {s} do • G=(V,E) undirected graph
Color[u] = WHITE
d[u] = ∞
partition[u] = 0
• G adalah BG jika ada suatu partisi dari V ke
Color[s] = gray
partition[s] = 1
dalam V,W
d[s] = 0 V= U ∪ W
Q = [s]
While Queue 'Q' is not empty do
• sedemikian
d iki rupa sehingga
hi U ∩ V =∅

• Setiap edge memiliki satu end point dalam U


u = head [Q]
for each v in Adj[u] do
if partition [u] = partition [v] then

else
return 0 dan lainnya dalam W
if color[v] WHITE then
color[v] = gray
d[v] = d[u] +1
partition[v] = 3 - partition[u]
ENQUEUE (Q, v)
DEQUEUE (Q)
Color[u] = BLACK
Return 1

Pencarian Mendalam
contoh
(Depth First Search atau DFS).
• Traversal dimulai dari simpul v.
• Algoritma:
X – Kunjungi simpul v,
– Kunjungi simpul w yang bertetangga dengan simpul v.
X
– Ulangi DFS mulai dari simpul ww.
– Ketika mencapai simpul u sedemikian sehingga semua simpul
yang bertetangga dengannya telah dikunjungi, pencarian
dirunut-balik ke simpul terakhir yang dikunjungi sebelumnya
dan mempunyai simpul w yang belum dikunjungi.
U W
– Pencarian berakhir bila tidak ada lagi simpul yang belum
dikunjungi yang dapat dicapai dari simpul yang telah dikunjungi.

maze

5
5/22/2010

Representasi Array Representasi Array


•Salah satu representasi graph adalah dengan matrik n2 (matrik
dengan n baris dan n kolom, artinya baris dan kolom
berhubungan ke setiap vertex pada graph).
•Jika ada edge dari vi ke vj maka entri dalam matrik dengan index
baris sebagai vi dan index kolom sebagai vj yang di set ke 1
(adj[vi, vj] = 1, jika (vi, vj) adalah suatu edge dari graph G).
•Jika e adalah total jumlah edge dalam graph, maka ada entri 2e
yang di set ke 1, selama G adalah graph tak berarah.
•Jika G adalah graph berarah, hanya entri e yang di set ke-1
dalam matrik keterhubungan.

Representasi Linked List Contoh Lain directed


1 2 3 4 5 6
1 5
1 0 0 1 0 1 1
6
2 0 0 0 0 0 0
2
3
3 1 0 0 0 0 1
4
4 0 0 0 0 0 0

5 0 1 0 0 0 0

6 0 0 0 1 0 0

Contoh Lain directed Contoh Lain directed


i e[i][1] e[i][2] i s[i]
1 Æ 3 Æ 5 Æ 6 1 5 1 5
1 1 3 1 1
2
6 2 1 5 2 4 6
3 Æ 1 Æ 6
2 3 1 6 3 4 2
3 3
4 4 4 3 1 4 6 4

5 Æ 2 5 3 6 5 6

6 Æ 4 6 5 2 6 7

7 6 4

6
5/22/2010

Performa DFS Graph


Adjacency Adjacency Edge List 5/6 7/8 4/4
Matrix Linked List
Memory O(V2) O(V+E) O(V+E)
Storage
Check O(1) O(deg(u)) O(deg(u))
whether
(u,v) is an
edge 0/11
1/10 2/3
Find all O(V) O(deg(u)) O(deg(u))
adjacent
vertices of a
vertex u
deg(u): # edge terhubung dg vertex u -Jika node ini putih maka explorasi node tersebut
-Jumlah edge merah sama dengan n-1
-Edge merah membentuk subgraf terhubung
-Edge merah membentuk suatu tree (dfs tree)

Dfs tree Depth First Search


0/11 Egde tree
Properti tikus :
Back tree adalah Tahu arah
Suatu edge dari node Memori node
ke ancestornya Backtrack :
1/10 Kembali ke node
sebelumnya yang
sudah di kunjungi
4/9
2/3

5/6 7/8

DFS menentukan setiap edge sebagai suatu tree atau back tree
chesse

Model Graph DFS graph


Representasi datanya memakai
Adjancent list
S S 5/6
7/8
4/9

0/11 2/3
s 1/10

Source node di labeli 0, lalu pilih node baru dan labeli 1, lalu

E E pilih node baru labeli 2, pada node ini tidak ada lagi node
yang dapat di kunjungi, kalau ke label 0 maka terjadi cycle
Jika node berwarna putih
Kita akan kunjungi node tsb
dan sudah pernah di kunjungi. Maka kita lakukan backtrack,
dan pada node yang baru di kunjungi ini kita naikan nilai
label menjadi 3.

Setiap kali kita mengunjungi node, perlu di catat dan di naikan nilai labelnya

7
5/22/2010

G
Contoh lain Dfs graph s
Dfs tree
0/11

Garis biru adalah tree edge


Garis merah putus adalah back edge ?
5/6
7/8
4/9 back edge : suatu edge dari node ke ancestor
1/10

Jadi DFS
DFS, mengklasifikasikan setiap edge seba
TREE atau BACK EDGE
0/11 2/3
s 1/10 4/9
2/3

5/6
Edge yang terbentuk dari dfs ini 7/8
Adalah n-1, n adalah node

Implementasi dfs rekursif Modifikasi dfs rekursif


• Stack dan rekursi • Buat 2 array utk menandai setiap edge
– a(arrival), untuk a[v] adalah saat kunjungan vertek
• Buat array, visited=1, not visited=0
– d(departure), dan d[v] adal saat meninggalkan vertek
G
v 0/1 – time untuk counter tiap p kunjungan
j g dan saat
v
meninggalkan vertek
x z
DFS (v){ y
a;d;time=0;
visited[v]=1; {source} DFS (v){
for all w adj. to v do visited[v]=1; {source}
if !visited[w] then a[v]=time++;
DFS(w) Dfs(v) for all w adj. to v do
} dfs(x) if !visited[w] then
| DFS(w); (v,w)=tree edge
Bagaimana kalo kita akan menghitung dfs(y) d[v]=time++;
Kunjungan pada tiap node ? | }

Algoritma DFS iteratif Contoh dengan stack iteratif


Dfs(v){ Stack yang tebentuk
PÅ∅
mark[v]Åvisited; //boolean value
PÅPush (v);
While P≠∅ do{ Anak root kiri
while (Ada vertek w yg mrp adj top P dan
mark[w] ≠visited) do { Masuk stack stack
Masuk stack stack
mark[w]Å visited; Masuk stack stack
PÅ push(w);
} Anak root kanan

}
Masuk stack
pop(P); Masuk stack
Masuk stack
}
Masuk stack

8
5/22/2010

Lanjutan Garis putus


adalah
Algoritma DFS dg matrik
Back edge
void buildadjm(int adj[][max], int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++) {
printf(“Masukan 1 jika ada edge
Tree hasil DFS dari %d ke %d, kalau tidak
0 \n", i,j);
scanf("%d",&adj[i][j]);
}
}

Algoritma DFS dg matrik Contoh


void dfs(int x,int visited[],
int adj[][max],int n) {
int j;
visited[x] = 1;
printf(“Node yang di kunjungi %d\n",x);
for(j=0;j<n;j++)
if(adj[x][j] ==1 && visited[j] ==0)
dfs(j,visited,adj,n);
}

source simulasi

Gambarkan Graph yang mungkin


Contoh Lain
dg algoritma DFS ?
• Kunjungan Awal vertex 0
1 7
• Hasilnya
2 3
–012678534
–043586721
4 5 8 Transformasikan ke dalam
Matrik ?
6

9
5/22/2010

Analisis DFS Analisis DFS


• Jika graph G di aplikasikan dengan depth-first search (dfs) • Jika graph G memiliki vertek n dan edge e, maka jumlah
yang di representasikan dengan list keterhubungan, maka derajat tiap vertek (d1 + d2 + …+ dn) adalah 2e. Dengan
vertek y yang berhubungan ke x dapat di tentukan dengan list demikian, ada total 2e node list dalam list keterhubungan G .
keterhubungan dari setiap vertek yang berhubungan. Jika G adalah directed graph, maka jumlah total e adalah node
• Dengan demikian pencarian for loop untuk vertek list saja.
j
keterhubungan memiliki total cost d1 + d2 +…+ dn, dimana di • Waktu tempuh yang di perlukan untuk melakukan pencarian
adalah derajat vertek vi, karena jumlah node dalam list secara lengkap adalah O(e), dengan n<= e. Jika menggunakan
keterhubungan dari vertek vi adalah di. matrik keterhubungan untuk merepresentasikan graph G,
maka waktu tempuh untuk menentukan seluruh vertek
adalah O(n), dan karena seluruh vertek di kunjungi, maka total
waktunya adalah O(n2).

Soal Problem: Finding Area


• Cari Edge Tree, Back Edge dan gambarkan dfs tree • Cari area
• Labeli setiap edge/node berurutan abjad yang dapat
• Buatlah matrik keterhubungannya ditemukan A
dari A
A.

solusi

Aplikasi dfs pd directed graph Bagaimana melihat bahwa ada path


strongly connected dari setiap vertek dari v dalam G
1. If dfs(v) visit all vertek dalam G, then ∃ path
dari v ke setiap vertek dalam G

2. ∃ path dari setiap vertek dalam G ke v


G Reverse edge GR
Misal ini benar
Lakukan dfs(v)
Jadi 1+2 = strongly connected, kenapa ?
If seluruh vertek telah di kunjungi maka
Karena jika ada vertek x, y, maka dari Procedurenya : Mengakibatkan di dalam G ada path
xÆvÆy Ambil vertek dalam G Dari setiap vertek ke v GR
(2) Lakukan dfs (v)
(1)
Jad yang di perlukan adalah meyakinkan Reverse G
Ada suatu PATH dari v ke setiap vertek di G
Lakukan dfs(v) dalam GR

If seluruh vertek telah dikunjungi dengan dfs dalam G dan GR


Maka G adalah strongly connected else G bukan strongly connected

10
5/22/2010

Cara lain melihat strongly connected


Aplikasi dfs dan bfs dalam G
pada G
dfsSC(v) {
• strongly connected (dfs dir.)
a[v]=time++;visited[v]=1;
mini=a[v]; • Memeriksa acyclic dalam G (dfs dir.)
for all w adj to v do
if !visited[w] then
• Topologi SORT (dfs dir.)
mini=min(mini,dfsSc(w)) • 2 edge connectivity (dfs undir.)
else mini=min(mini,a[w])
if mini==a[v] then STOP {not strongly connected} • Connected component (bfs undir)
}
• Bipartite graph (bfs undir)
• Semuanya berada dalam order linear

Tugas Simulasi
• Buat Simulasi Algoritma DFS dan BFS
• Hitung Order Fungsi dan kompleksitasnya
• Presentasikan

11

Anda mungkin juga menyukai