Professional Documents
Culture Documents
DFS
DFS
פרק 3בKleinberg/Tardos-
פרק 23.3-5בCormen et al-
רכיבים אי-פריקים
רכיבים קשירים היטב
מיון טופולוגי
1
קשירות
2
קשירות
s t
2
כשלון הגישה החמדנית
s t
3
כשלון הגישה החמדנית
s t
3
תיקון
s t
s t
s t
s t
s t
s t
s t
s t
אתחולO(|V|) :
מבצעים ) DFS(G,xלכל היותר פעם אחת לכל .x
נחייב את הקריאה ל DFS(G,x)-על .x
למעט הקריאות הרקורסיביות DFS(G,x) ,עולה )|]O(1)+O(|Adj[x
סה”כO(|V|) + ∑x∈V {O(1) + O(|Adj[x]|)} = O(|V|+|E|) :
6
סיווג הקשתות
7
הדגמה
זוגות המספרים על הצמתים: המספרים על הקשתות:
סדר הגילוי וסדר החזרה. סדר הסריקה.
1, 8 2 2, 3 3 3, 2 4 4, 1
1
0, 9 7 9 6 5
13
7, 4 8 6, 7 10 8, 6 11 5, 0
9
רכיבים אי פריקים
10
תכונות
11
צומת הפרדה הדגמה
גשר
12
צומת הפרדה הדגמה
גשר
12
צומת הפרדה הדגמה
גשר
12
הדגמה
13
זיהוי צמתי הפרדה
14
הוכחה
15
הוכחה )המשך(
16
הדגמה
s 6
5 12
2 1
10
3 11
4
7
9
8
17
הדגמה
s 6
5 12
2 1
10
3 11
4
7
9
8
17
הדגמה
s 6
5 12
2 1
10
3 11
4
7
9
8
17
הדגמה
s 6
5 12
2 1
10
3 11
4
7
9
8
17
הדגמה
s 6
5 12
2 1
10
3 11
4
7
9
8
17
הדגמה
s 6
5 12
2 1
10
3 11
4
7
9
8
17
הדגמה
s 6
5 12
2 1
10
3 11
4
7
9
8
17
מציאת צמתי הפרדה
18
הדגמה
5 12
2 1
10
3 11
4
7
9
8
19
הדגמה
0 בכחול :ערך low
0 6
והקשת שקבעה.
5 12
2 1
10
3 11
4
7
9
8
19
הדגמה
0 בכחול :ערך low
0 6
והקשת שקבעה.
10
3 11
4
7
9
8
19
הדגמה
0 בכחול :ערך low
0 6
והקשת שקבעה.
10
3 11
4
7
9
8
19
הדגמה
0 בכחול :ערך low
0 6
והקשת שקבעה.
9
8
19
הדגמה
0 בכחול :ערך low
0 6
והקשת שקבעה.
9
8
19
הדגמה
0 בכחול :ערך low
0 6
והקשת שקבעה.
0
2 0 5 12
2 1
2 10
2
3 11
4
7
9
8
19
הדגמה
0 0 בכחול :ערך low
0 6
והקשת שקבעה.
0
2 0 5 12
2 1
2 10
2
3 11
4
7
9
8
19
הדגמה
0 0 בכחול :ערך low
0 6
והקשת שקבעה.
0
2 0 5 12
2 1
2 10
2
3 1 11
4
7
9
8
19
הדגמה
0 0 בכחול :ערך low
0 6
והקשת שקבעה.
0
2 0 5 12
2 1
2 10
2
3 1 11
4
7
8 9
8
19
הדגמה
0 0 בכחול :ערך low
0 6
והקשת שקבעה.
0
2 0 5 12
2 1
2 10
2
3 1 11
4
7
19
הדגמה
0 0 בכחול :ערך low
0 6
והקשת שקבעה.
0
2 0 5 12
2 1
7
2 10
2
3 1 11
4
7
19
הדגמה
0 0 בכחול :ערך low
0 6
והקשת שקבעה.
0
2 0 5 12
2 1
7
2 10 9
2
3 1 11
4
7
19
הדגמה
0 0 בכחול :ערך low
0 6
והקשת שקבעה.
0 9
2 0 5 12
2 1
7
2 10 9
2
3 1 11
4
7
19
עבור צומת שאיננו השורשlow חישוב
x ילד שלy במקרה זה
DFS_low(G,x)
low[x] ← pre[x] ← pre_c++
ישy-העץ המושרש ב-מתת
for each y ∈ Adj[x] do
קשת אחורה לאב קדמון
if pre[y] = ∞ then הנוכחיlow[x] של
DFS_low(G,y)
if low[y] < low[x] then low[x] ← low[y]
if low[y] ≥ pre[x] then art[x] ← “yes”
else if pre[y] < low[x] then
low[x] ← pre[y] x אב קדמון שלy במקרה זה
end if
end for
end DFS_low
20
סימון הרכיבים האי-פריקים
for each y ∈ Adj[x] do
) then push({x,y},stackלא סרקנו עדיין את }if {x,y
if pre[y] = ∞ then
... נחזיק מחסנית של קשתות
if low[y] ≥ pre[x] then
”art[x] ← “yes זה מונה של מספר הרכיבים
bcc_c++
repeat את הלולאה של שליפת קשתות
)e ← pop(stack מהמחסנית צריך לבצע גם עבור
bcc[e] ← bcc_c כל ילד yשל השורש .s
}while e ≠ {x,y
end if
... שימו לב :ייתכן של x-יש מספר ילדים
end if שיזהו אותו כצומת הפרדה ,ואז כל ילד
end for כזה יגרום לשליפת רכיב אי-פריק.
21
סיבוכיות
22
תרגיל בית
23
רכיבים קשירים היטב
24
הדגמה
25
הדגמה
25
Kosaraju-Sharir אלגוריתם
KS(G)
for each x ∈ V do post[x]←∞, from[x]←nil, scc[x]←∞
post_c ← 0, scc_c ← 0
for each x ∈ V do יציין אתscc[x] הערך
if post[x] = ∞ then DFS(G,x) .x מספר הרכיב אליו שייך
end for
sort(V,-post) יורדpost בסדרV נמיין את
for each x ∈ V do
if scc[x] = ∞ then
DFS_scc(GT,x)
scc_c++ עלG-מתקבל מGT הגרף
end if .ידי הפיכת כל הקשתות
end for
end KS
26
קשתות עץ הדגמה :תוצאות DFS
קשתות קדימה
קשתות אחורה
קשתות הצידה
2 2, 3
1, 6
7 3
1 8
3, 2
0, 7 9
12 6
6, 5 4
5, 0
11 5
10 4, 1
המספרים על הקשתות:
סדר הסריקה.
7, 4
זוגות המספרים על הצמתים:
סדר הגילוי וסדר החזרה.
27
איסוף רכיב קשיר היטב
DFS_scc(G,x)
scc[x] ← scc_c
for each y ∈ Adj[x] do
if scc[y] = ∞ then DFS_scc(G,y)
end for
end DFS_scc
28
קשתות עץ הדגמה :תוצאות DFS_scc
קשתות קדימה
קשתות אחורה
קשתות הצידה 3
63, 0 6 4, 4
12 7
5 2
7 4 5, 7
0, 3 11
3 5 8
2, 1 10 0
6, 6
1 1 9
2 7, 5
המספרים על הקשתות:
סדר הסריקה.
1, 2 4
באדום :סדר זוגות המספרים על הצמתים:
החזרה בDFS- סדר הגילוי וסדר החזרה.
29
הוכחת נכונות
30
קשתות עץ הדגמה :חישוב φ
קשתות קדימה
קשתות אחורה
קשתות הצידה
3, 3
6, 7
2, 2
7, 7
5, 7
0, 2
1, 2
4, 7
זוגות המספרים על הצמתים:
סדר החזרה וערך .φ
31
הוכחת נכונות )המשך(
הוכחה :אם φ(x) = xאז בוודאי הטענה נכונה .אם חזרנו כבר
הוכחה
מ φ(x)-לפני שגילינו את xאז ] ,post[φ(x)] < post[xוזו סתירה
להגדרת ).φ(x
נניח שגילינו את xלפני שגילינו את ) .φ(xאזי יהי zהצומת
האחרון במסלול מ x-ל φ(x)-שנתגלה לפני או בזמן גילוי .xיש
כזה כי xכזה .כל הצמתים בקטע המסלול מ z-ל φ(x)-עדיין לא
נתגלו בזמן גילוי .zלכן כולם ,בפרט ) φ(xיתגלו בין גילוי zלחזרה
מ .z-לכן ] post[φ(x)] < post[zוזו סתירה להגדרה של ) ,φ(xכי z
נגיש מ.x-
לכן ,האפשרות היחידה היא ש x-נתגלה בין גילוי ) φ(xלבין
החזרה מ ,φ(x)-כלומר x ,נמצא בתת-העץ המושרש ב ,φ(x)-ולכן
יש מסלול מכוון מ φ(x)-ל∴ .x-
32
הוכחת נכונות )המשך(
33
הוכחת נכונות )המשך(
34