Anda di halaman 1dari 11

28-2-2011

1
AlgorlLma 8lS dan ulS
wl[anarLo
AlgorlLma Craph
AlgorlLma Lraversal dl dalam graf adalah
mengun[ungl slmpul-slmpul dengan cara yang
slsLemaLlk.
encar|an Me|ebar (8teoJtb lltst 5eotcb aLau
8lS),
encar|an Menda|am (ueptb lltst 5eotcb aLau
ulS).
encar|an Me|ebar
(8teoJtb lltst 5eotcb aLau 8lS)
ldenya mlrlp dengan algo prlm dan dl[ksLra
1raversal dlmulal darl slmpul v.
AlgorlLma:
kun[ungl slmpul v,
kun[ungl semua slmpul yang berLeLangga dengan slmpul v
Lerleblh dahulu.
kun[ungl slmpul yang belum dlkun[ungl dan berLeLangga
dengan slmpul-slmpul yang Ladl dlkun[ungl, demlklan
seLerusnya.
!lka graf berbenLuk pohor berakar, maka semua slmpul pada
aras J dlkun[ungl leblh dahulu sebelum slmpul-slmpul pada
aras J + 1.
Craph Searchlng AlgorlLhm
encarlan SlsLemlk pada seLlap edge dan
verLek darl graph C
Craph C=(v,L), dlrecLed aLau undlrecLed
Apllkasl
Compller
Craphlcs
Maze
Mapplng
neLwork : rouLlng,searchlng,clusLerlng, dsb
8epresenLasl 8lS
ada umumnya graf dl represenLaslkan balk
secara array aLaupun llsL
ualam kullah lnl menggunakan Llnk LlS1 dan
queue
struct node {
int data;
struct node *link;
};
1 0 2
2 1 2
s r t u
y x w v
1 0
1
s r t u
y x w v
Q w
1
r
1
ConLoh bfs
s
0
0

s r t u
y x w v
Q
0

s r t u
y x w v
Q w
1
s
0
Q r
1
t
2
x
2
28-2-2011
2
1 0 2 3
2 1 2 3
s r t u
y x w v
1 0 2 3
2 1 2
s r t u
y x w v
ConLoh bfs
1 0 2
2 1 2
s r t u
y x w v
Q t
2
x
2
v
2
Q x
2
v
2
u
3
Q v
2
u
3
y
3
1 0 2 3
2 1 2 3
s r t u
y x w v
Q u
3
y
3
ConLoh bfs
1,2,3 adalah label verLek dalam C
1 merupakan pan[ang shorLesL paLh darl s
(source)(s-w,s-r)
2 berarLl ada 2 edge
(s-L,s-x,s-v)
3 berarLl ada 3 edge
(s-u,s-y)
1 0 2 3
2 1 2 3
s r t u
y x w v
1
8fs secara graflkal
A 8
L l
C u
C P
l !
M n
k L
C
0
A 8
L l
C u
C P
l !
M n
k L
C
0
A 8
L l
C u
C P
l !
M n
k L
C
0 1 2
A 8
L l
C u
C P
l !
M n
k L
C
0 1 2 3
8fs secara graflkal
A 8
L l
C u
C P
l !
M n
k L
C
0 1 2 3
4
A 8
L l
C u
C P
l !
M n
k L
C
0 1 2 3
4
5
AlgorlLma bfs 1
For each vertek uV[G] {s} do
color[u]putih
d[u] {tdk di labeli}
pi[u]nil {predesesor vertek}
Color[s]abu2
D[s]0
Pi[s]nil
Q{s}
While Qo do
uhead[Q]
for each v adj[u] do
if color[v]putih then
color[v]abu2
d[v]d[u]+1
pi[v]u
ENQUEUE(Q,v)
DEQUEUE(Q)
color[u]Hitam
INIT semua
VERTEK
INIT BFS
dengan s
(source)
Tangani
seluruh anak s
SEBELUM
menangani
anak dari
anaknya
BFS (G, s)
AlgorlLma bfs 2
Bfs(v){
Q;
mark[v] visited;
Qenqueue(v);
while Q do {
u first(Q)
dequeue(u)
for w adj pada u do {
if mark[w] visited then
mark[w]visited
QEnqueue (w)
}
}
}
28-2-2011
3
AlgorlLma ualam LlsL (1)
void BFS(VLink G[], int v) {
int w; VISIT(v); /*visit vertex v*/
visited[v] = 1; /*tandai v, telah di kunjungi dengan : 1 */
ADDQ(Q,v);
while(!QMPTYQ(Q)) {
v = DELQ(Q); /*Dequeue v*/
w = FIRSTADJ(G,v);/*cari tetangga pertama, return -1 if tidak ada */
while(w != -1) {
if(visited[w] == 0) {
VISIT(w); /*visit vertex v*/
ADDQ(Q,w); /*Enqueue vertek yang sedang di kunjungi w*/
visited[w] = 1; /*tandai w telah di kunjungi*/
}
/*cari tetangga selanjutnya, return -1 if tidak ada*/
w = NEXTADJ(G,v);
}
}
}
AlgorlLma ualam LlsL (2)
void TRAVEL_BFS(VLink G[],int visited[],int n) {
int i;
/* Inisialisasi seluruh vertek
dengan visited[i] = 0 */
for(i = 0; i < n; i ++) {
visited[i] = 0;
}
/* Lakukan BFS ke seluruh vertek dlm G*/
for(i = 0; i < n; i ++)
if(visited[i] == 0) BFS(G,i);
}
8lS
roperLl dan runnlng Llme
C(v+L)
C=(v,L), bfs mencarl seluruh verLek yg dapaL dl
ralh darl source s
unLuk seLlap verLek pada level l, paLh bfs Lree
anLara s dan v mempunyal l edge dan selaln paLh
dlm C anLara s dan v seLldaknya mempunyal l
edge
!lka (u,v) adalah edge maka [umlah level u dan v
dl bedakan seLldaknya saLu LlngkaL
8fs menghlLung seluruh [arak Lerpendek ke
seluruh verLek yang dapaL dl ralhnya.
kegunaan 8lS
Memerlkasa apakah graph Lerhubung
menghlLung spannlng foresL graph
MenghlLung, Llap verLex dlm graph, [alur dg
[umlah edge mlnlmum anLara verLex awal dan
currenL verLex aLau keLladaan paLh.
MenghlLung cycle dlm graph aLau keLladaan
cycle.
C(v + L).
AlgorlLma 8lS dg maLrlk 1
void buildadjm(int adj[][MAX], int n) {
int i,j;
printf("enter adjacency matrix \n",i,j);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&adj[i][j]);
}
AlgorlLma 8lS dg maLrlk 2
struct node *addqueue(struct node *p,int val) {
struct node *temp;
if(p == NULL) {
p = (struct node *) malloc(sizeof(struct node));
/* insert the new node first node*/
if(p == NULL) { printf("Cannot allocate\n"); exit(0); }
p->data = val; p->link=NULL;
} else {
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);
}
28-2-2011
4
AlgorlLma 8lS dg maLrlk 3
struct node *deleteq(struct node *p,int *val) {
struct node *temp;
if(p == NULL) {
printf("queue is empty\n");
return(NULL);
}
*val = p->data;
temp = p;
p = p->link;
free(temp);
return(p);
}
AlgorlLma 8lS dg maLrlk 4
void bfs
(int adj[][MAX],int x,int visited[],int n, struct node **p){
int y,j,k;
*p = addqueue(*p,x);
do{ *p = deleteq(*p,&y);
if(visited[y] == 0){
printf("\nnode visited = %d\t",y);
visited[y] = 1;
for(j=0;j<n;j++)
if((adj[y][j] ==1) && (visited[j] == 0))
*p = addqueue(*p,j);
}
}while((*p) != NULL);
}
ConLoh pada MaLrlk 9x9
1 2 3 4 3 6 7 8 9
1 0 1 0 0 1 0 0 0 0
2 1 0 1 1 0 0 0 0 0
3 0 1 0 0 0 0 1 0 0
4 0 1 0 0 1 1 0 0 0
3 1 0 0 1 0 0 0 0 0
6 0 0 0 1 0 0 0 0 1
7 0 0 1 0 0 0 0 1 1
8 0 0 0 0 0 0 1 0 0
9 0 0 0 0 0 1 1 0 0
node visited = 0
node visited = 1
node visited = 4
node visited = 2
node visited = 3
node visited = 6
node visited = 5
node visited = 7
node visited = 8
0
1
2
4
3
7
3 6
8
ConLoh laln
Awal slmpul adalah v1, darl graf C dl bawah
kun[ungan 8lS menghasllkan :
v1,v2,v3,v3,v4,v7,v6,v8,v9
Apllkasl bfs
(connecLed componenL)

!lka ada label yang elemennya sama berarLl


LerdapaL CC dan Seballknya
8ACAlMAnA kl1A MLM8uA1n?A ??
1
1
1
1
1
1
2
2
2
3
3
3
3
4 5
No CC
v
1 1 1 2 2 4 2 5 3 3 3
Apllkasl bfs
(connecLed componenL)
lnlslalkan seluruh verLek dlm C dengan 0
Mulal darl sembarang verLek dengan nllal 0 dalam CC lalu
lakukan bfs
Carl verLek dg nllal 0 selan[uLnya dan lakukan bfs lagl
1
1
1
1
1
1
2
2
2
3
3
3
3
4 5
No CC
f
1 2 1 2 1 2 0 1 1 0 1
a b
c
d
e
f
a d b e c
g
h
i
i g h
28-2-2011
5
Apllkasl bfs
(connecLed componenL)
8unnlng 1lme = C(m+n)
M= # edge
n=scannlng array unLuk mecarl CC
1erdapaL m saaL klLa melakukan bfs, sekallgus n saaL melabell
CC dalam array
Apllkasl bfs
(8lparLlLe graph )
8lparLlLe graph : undlrecLed graph C = (v, L)
dlmana v dapaL dl bagl men[adl 2 hlmpunan
v
1
dan v
2
sehlngga (o, v) menyebabkan balk u
v
1
dan v v
2
aLau u v
2
dan v v
1
.
Sehlngga seluruh edge ada dlanLara 2
hlmpunan v
1
dan v
2
.
AlgorlLma
ALGORITHM: BIPARTITE (G, S)
For each vertex U V[G] - {s} do
Color[u] = WHITE
d[u] =
partition[u] = 0
Color[s] = gray
partition[s] = 1
d[s] = 0
Q = [s]
While Queue 'Q' is not empty do
u = head [Q]
for each v in Adj[u] do
if partition [u] = partition [v] then
return 0
else
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
8lparLlLe Craph
C=(v,L) undlrecLed graph
C adalah 8C [lka ada suaLu parLlsl darl v ke
dalam v,W
sedemlklan rupa sehlngga
SeLlap edge memlllkl saLu end polnL dalam u
dan lalnnya dalam W
v= u W
u v =
conLoh
U W
X
X
encar|an Menda|am
(ueptb lltst 5eotcb aLau ulS).
1raversal dlmulal darl slmpul v.
AlgorlLma:
kun[ungl slmpul v,
kun[ungl slmpul w yang berLeLangga dengan slmpul v.
ulangl ulS mulal darl slmpul w.
keLlka mencapal slmpul o sedemlklan sehlngga semua slmpul
yang berLeLangga dengannya Lelah dlkun[ungl, pencarlan
dlrunuL-ballk ke slmpul Lerakhlr yang dlkun[ungl sebelumnya
dan mempunyal slmpul w yang belum dlkun[ungl.
encarlan berakhlr blla Lldak ada lagl slmpul yang belum
dlkun[ungl yang dapaL dlcapal darl slmpul yang Lelah dlkun[ungl.
28-2-2011
6
8epresenLasl Array
Salah saLu represenLasl graph adalah dengan maLrlk o
2
(maLrlk
dengan n barls dan n kolom, arLlnya barls dan kolom
berhubungan ke seLlap verLex pada graph).
!lka ada edge darl v
l
ke v
[
maka enLrl dalam maLrlk dengan lndex
barls sebagal v
l
dan lndex kolom sebagal v
[
yang dl seL ke 1
(ad[[v
l
, v
[
] = 1, [lka (v
l
, v
[
) adalah suaLu edge darl graph C).
!lka e adalah LoLal [umlah edge dalam graph, maka ada enLrl 2e
yang dl seL ke 1, selama C adalah graph Lak berarah.
!lka C adalah graph berarah, hanya enLrl e yang dl seL ke-1
dalam maLrlk keLerhubungan.
8epresenLasl Array
8epresenLasl Llnked LlsL
ConLoh Laln dlrecLed
1 2 3 4 5 6
1 0 0 1 0 1 1
2 0 0 0 0 0 0
3 1 0 0 0 0 1
4 0 0 0 0 0 0
5 0 1 0 0 0 0
6 0 0 0 1 0 0
11
22
33
44
66
55
ConLoh Laln dlrecLed
1 3 5 6
2
3 1 6
4
5 2
6 4
11
22
33
44
66
55
ConLoh Laln dlrecLed
i e[i][1] e[i][2]
1 1 3
2 1 5
3 1 6
4 3 1
5 3 6
6 5 2
7 6 4
11
22
33
44
66
55
i s[i]
1 1
2 4
3 4
4 6
5 6
6 7
28-2-2011
7
erforma
Adjacency Adjacency
Matrix Matrix
Adjacency Adjacency
Linked List Linked List
Edge List Edge List
Memory Memory
Storage Storage
O(V O(V
22
)) O(V+E) O(V+E) O(V+E) O(V+E)
Check Check
whether whether
((,,) is an ) is an
edge edge
O(1) O(1) O(deg(u)) O(deg(u)) O(deg(u)) O(deg(u))
Find all Find all
adjacent adjacent
vertices of a vertices of a
vertex vertex
O(V) O(V) O(deg(u)) O(deg(u)) O(deg(u)) O(deg(u))
deg(u): # edge deg(u): # edge terhubung terhubung dg vertex dg vertex
ulS Craph
0/11
1/10 2/3
4/9 7/8 5/6
-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)
ufs Lree
0/11
1/10
2/3
4/9
5/6
7/8
Egde tree
Back tree adalah
Suatu edge dari node
ke ancestornya
DFS menentukan setiap edge sebagai suatu tree atau back tree
uepLh llrsL Search
chesse
Properti tikus :
Tahu arah
Memori node
Backtrack :
Kembali ke node
sebelumnya yang
sudah di kunjungi
Model Craph
S
E
SS
EE
ulS graph
Source node dl labell 0, lalu plllh node baru dan labell 1, lalu
plllh node baru labell 2, pada node lnl Lldak ada lagl node
yang dapaL dl kun[ungl, kalau ke label 0 maka Ler[adl cycle
dan sudah pernah dl kun[ungl. Maka klLa lakukan backLrack,
dan pada node yang baru dl kun[ungl lnl klLa nalkan nllal
label men[adl 3.
s
Representasi datanya memakai
Adjancent list
0/11
1/10
Setiap kali kita mengunjungi node, perlu di catat dan di naikan nilai labelnya
2/3
4/9
5/6
7/8
Jika node berwarna putih
Kita akan kunjungi node tsb
28-2-2011
8
s
ConLoh laln ufs graph
0/11
1/10
2/3
4/9
5/6
7/8
Edge yang terbentuk dari dfs ini
Adalah n-1, n adalah node
ufs Lree
Garis biru adalah tree edge
Garis merah putus adalah back edge ?
s
0/11
1/10
2/3
4/9
5/6
7/8
G
back edge : suatu edge dari node ke ancestor
Jadi DFS, mengklasifikasikan setiap edge sebagai
TREE atau BACK EDGE
lmplemenLasl dfs rekurslf
SLack dan rekursl
8uaL array, vlslLed=1, noL vlslLed=0
v
0/1
DFS (v){
visited[v]=1; {source}
for all w adj. to v do
if !visited[w] then
DFS(w)
}
v
G
x
y
z
Dfs(v)
dfs(x)
|
dfs(y)
|
Bagaimana kalo kita akan menghitung
Kunjungan pada tiap node ?
Modlflkasl dfs rekurslf
8uaL 2 array uLk menandal seLlap edge
a(arrlval), unLuk a[v] adalah saaL kun[ungan verLek
d(deparLure), dan d[v] adal saaL menlnggalkan verLek
Llme unLuk counLer Llap kun[ungan dan saaL
menlnggalkan verLek
a;d;time=0;
DFS (v){
visited[v]=1; {source}
a[v]=time++;
for all w adj. to v do
if !visited[w] then
DFS(w); (v,w)=tree edge
d[v]=time++;
}
AlgorlLma ulS lLeraLlf
Dfs(v){
P
mark[v]visited; //boolean value
PPush (v);
While P do{
while (Ada vertek w yg mrp adj top P dan
mark[w] visited) do {
mark[w] visited;
P push(w);
}
}
pop(P);
}
ConLoh dengan sLack lLeraLlf
Stack yang tebentuk
stack
stack
stack
Anak root kiri
Anak root kanan
Masuk stack
Masuk stack
Masuk stack
Masuk stack
Masuk stack
Masuk stack
Masuk stack
28-2-2011
9
Lan[uLan
Tree hasil DFS
Garis putus
adalah
Back edge
AlgorlLma ulS dg maLrlk
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
dari %d ke %d, kalau tidak
0 \n", i,j);
scanf("%d",&adj[i][j]);
}
}
AlgorlLma ulS dg maLrlk
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);
}
ConLoh
source simulasi
Cambarkan Craph yang mungkln
dg algorlLma ulS ?
1 7
2 3
4 3 8
6
ConLoh Laln
kun[ungan Awal verLex 0
Pasllnya
0 1 2 6 7 8 3 3 4
0 4 3 3 8 6 7 2 1
1ransformaslkan ke dalam
MaLrlk ?
28-2-2011
10
Anallsls ulS
I|ka graph C dl apllkaslkan dengan depLh-flrsL search (dfs)
yang dl represenLaslkan dengan llsL keLerhubungan, maka
verLek y yang berhubungan ke x dapaL dl LenLukan dengan llsL
keLerhubungan darl seLlap verLek yang berhubungan.
uengan demlklan pencarlan for loop unLuk verLek
keLerhubungan memlllkl LoLal cosL d
1
+ d
2
+.+ d
n
, dlmana d
l
adalah dera[aL verLek v
l
, karena [umlah node dalam llsL
keLerhubungan darl verLek v
l
adalah d
l
.
Anallsls ulS
!lka graph C memlllkl verLek n dan edge e, maka [umlah
dera[aL Llap verLek (d
1
+ d
2
+ .+ d
n
) adalah 2e. uengan
demlklan, ada LoLal 2e node llsL dalam llsL keLerhubungan C .
!lka C adalah dlrecLed graph, maka [umlah LoLal e adalah node
llsL sa[a.
WakLu Lempuh yang dl perlukan unLuk melakukan pencarlan
secara lengkap adalah C(e), dengan o<= e. !lka menggunakan
maLrlk keLerhubungan unLuk merepresenLaslkan graph C,
maka wakLu Lempuh unLuk menenLukan seluruh verLek
adalah C(o), dan karena seluruh verLek dl kun[ungl, maka LoLal
wakLunya adalah C(o
2
).
Soal
Carl Ldge 1ree, 8ack Ldge dan gambarkan dfs Lree
Labell seLlap edge/node beruruLan ab[ad
8uaLlah maLrlk keLerhubungannya
solusi
roblem: llndlng Area
Carl area
yang dapaL
dlLemukan
darl A.
A
Apllkasl dfs pd dlrecLed graph
sLrongly connecLed
1. lf dfs(v) vlslL all verLek dalam C, Lhen paLh
darl v ke seLlap verLek dalam C
2. path dari setiap vertek dalam G ke v
Misal ini benar
Jadi 1+2 = strongly connected, kenapa ?
Karena jika ada vertek x, y, maka dari
xvy
(2)
(1)
Jad yang di perlukan adalah meyakinkan
Ada suatu PATH dari v ke setiap vertek di G
8agalmana mellhaL bahwa ada paLh
darl seLlap verLek darl v dalam C
G
Reverse edge
G
R
Lakukan dfs(v)
If seluruh vertek telah di kunjungi maka
Mengakibatkan di dalam G ada path
Dari setiap vertek ke v
G
R Ambil vertek dalam G
Lakukan dfs (v)
Reverse G
Lakukan dfs(v) dalam G
R
If seluruh vertek telah dikunjungi dengan dfs dalam G dan G
R
Maka G adalah strongly connected else G bukan strongly connected
Procedurenya :
28-2-2011
11
Cara laln mellhaL sLrongly connecLed
pada C
dfsSC(v) {
a[v]=time++;visited[v]=1;
mini=a[v];
for all w adj to v do
if !visited[w] then
mini=min(mini,dfsSc(w))
else mini=min(mini,a[w])
if mini==a[v] then STOP {not strongly connected}
}
Apllkasl dfs dan bfs dalam C
sLrongly connecLed (dfs dlr.)
Memerlksa acycllc dalam C (dfs dlr.)
1opologl SC81 (dfs dlr.)
2 edge connecLlvlLy (dfs undlr.)
ConnecLed componenL (bfs undlr)
8lparLlLe graph (bfs undlr)
Semuanya berada dalam order llnear
1ugas Slmulasl
8uaL Slmulasl AlgorlLma ulS dan 8lS
PlLung Crder lungsl dan komplekslLasnya
resenLaslkan

Anda mungkin juga menyukai