160 likes | 396 Views
גרף ( G=(V,E V|=n, |E|=m| מכוון לא מכוון דרגה של קדקד מסלול בגרף רכיבי קשירות. תזכורת: גרפים. A B C D E A 0 0 0 0 0 B 1 0 0 0 0 C 0 1 0 0 1 D 0 0 1 0 1 E 1 0 0 1 0. מטריצת שכנויות. A. E. C. B. D.
E N D
גרף(G=(V,E V|=n, |E|=m| מכוון \ לא מכוון דרגה שלקדקד מסלול בגרף רכיבי קשירות תזכורת: גרפים
A B C D E A 0 0 0 0 0 B 1 0 0 0 0 C 0 1 0 0 1 D 0 0 1 0 1 E 1 0 0 1 0 מטריצת שכנויות A E C B D
רשימות שכנות 12345 A E 1 2 5 3 5 1 4 C B D
class Node { // private data members Node getNbr(int i){ // compute I’th nbr } } גרף מצביעים
class State { // …. void move( …. ) { // change state } } גרף לא מפורש
אלגוריתם נאיבי search(s): print s for all u in s.nbrs search(u) קלט: גרףG, קדקדs פלט: כלהקדקדיםאליהם יש מסלול ב-G מ-s סריקת גרף
F = {s} Repeat v <- node from F for all v in u.nbrs if v not in F F = F + {v} Until no new nodes שיטות סריקה חיפוש לרוחב: Breadth First Search חיפוש לעומק: Depth First Search חיפוש לפי טיב Best First Search ... רעיון לשיפור: Memoization
while Q not empty u = Q.deque() print u for all v in u.nbrs if not v.visited v.visited=true Q.enque(v) אתחול: Que Q = {} for all v in V v.visited = false s.visited = true Q.enque(s) חיפוש לרוחב: (BFS(G,s
עובדה: לכלקדקדv (פרט ל- s) קייםקדקדu כך שב-G יש צלע (u,v), ו: d(s,v) = d(s,u) + 1 הגדרה: אורך המסלול הקצר ביותר ב-G מ-sל-uיסומןב- d(s,u) עובדה: אם ב-G יש צלע (u,v) אזי: d(s,v) <= d(s,u) + 1 מסלולים קצרים ביותר u v
while Q not empty u = Q.deque() for all v in u.nbrs if not v.visited v.visited=true v.d = u.d + 1 v.father = u Q.enque(v) אתחול: for all v in V v.visited = false v.d = infinity v.father = NULL s.visited = true s.d = 0 Que Q = {s} BFS עםחשוב מרחקים
למה: אם d(s,u) < d(s,w) אזיu נכנס לתור לפניw. הוכחה:באינדוקציה על d=d(s,u) משפט: בסוף הריצה, לכל הקדקדיםv: v.d = d(s,v) הוכחה: באינדוקציה על d=d(s,v) נכונותBFS
משפט: אלגוריתם זה מדפיס מסלול קצר ביותר מ-s ל-v. path(v) מדפיס את המסלול הקצר ביותר מ-s ל-v. if v != s path(v.father) print v הדפסת מסלול קצר ביותר
אתחול: for all v in V v.visited = false DFS(s) DFS(u): // starting with u u.visited = true print u for all v in u.nbrs if not v.visited DFS(v) // finished with u חיפוש לעומק: DFS
משפט: לגרףG יש מיון טופולוגיאםםאין בו מעגל. הוכחה: נבנה אלגוריתם! קלט: גרףG פלט: מיון טופולוגי שלהקדקדים. הגדרה: מיון טופולוגיהינוסידור שלהקדקדיםכך שאם יש בגרף צלע (u,v) אזי u יופיע לפני v בסדר. מיון טופולוגי
אתחול: for all v in V v.visited = false v.finished = false for all v in V if not v.visited DFS(v) DFS(u): u.visited = true for all v in u.nbrs if not v.visited DFS(v) else if not v.finished exit “cycle exists” print u u.finished = true מיון טופולוגי עםDFS
למה: אם בתוך ריצת DFS(u) נתקלנו בvשהינו visited and not finished אזי יש מסלול מ-v ל-u בגרף. משפט1: אם אין בגרף מעגלים אזי האלגוריתם מדפיס מיון טופולוגי (בסדר הפוך). 2: אם יש בגרף מעגל אזי האלגוריתם אומר כך. נכונות