Algorithms Tirgul 3

Download Report

Transcript Algorithms Tirgul 3

‫תרגול ‪DFS - 3‬‬
‫‪1‬‬
‫קודקודים מנתקים‬
‫‪ ‬הגדרה‪ :‬קודקוד בגרף לא מכוון נקרא קודקוד מנתק‬
‫אם הסרתו (יחד עם הקשתות הסמוכות אליו)‬
‫מגדילה את מספר רכיבי הקשירות של הגרף‪.‬‬
‫‪2‬‬
‫שאלה ‪ – 1‬מציאת קודקודים מנתקים‬
‫‪ ‬תרגיל‪ :‬נתון גרף לא מכוון ‪ .G  V , E ‬תארו‬
‫אלג' יעיל למציאת כל הקודקודים המנתקים שלו‪.‬‬
‫‪3‬‬
‫שאלה ‪ – 1‬פתרון‬
‫‪ ‬נריץ ‪ DFS‬על הגרף (ונשמור את זמן הגילוי של כל‬
‫קודקוד)‪.‬‬
‫]‪a[1‬‬
‫‪b‬‬
‫‪a‬‬
‫]‪d[4‬‬
‫]‪b[2‬‬
‫‪c‬‬
‫]‪c[3‬‬
‫]‪e[5‬‬
‫]‪f[6‬‬
‫‪4‬‬
‫]‪g[7‬‬
‫‪d‬‬
‫‪g‬‬
‫‪f‬‬
‫‪e‬‬
‫שאלה ‪ – 1‬המשך פתרון‬
‫‪ ‬מה אנחנו יודעים בינתיים?‬
‫‪ ‬השורש הינו קודקוד מנתק אם"ם יש לו לפחות ‪ 2‬ילדים‪.‬‬
‫(לא יתכנו קשתות בין תתי העצים שלו‪).‬‬
‫]‪a[1‬‬
‫‪ ‬עלה לא יכול להיות קודקוד מנתק‪.‬‬
‫]‪d[4‬‬
‫]‪b[2‬‬
‫]‪c[3‬‬
‫]‪e[5‬‬
‫]‪f[6‬‬
‫]‪g[7‬‬
‫‪5‬‬
‫שאלה ‪ – 1‬המשך פתרון‬
‫‪ ‬תוך כדי הרצת ה‪ DFS-‬נחשב לכל קודקוד‬
‫] ‪ d [v‬‬
‫‪‬‬
‫) ‪ ( v , u‬קשת אחורית בעץ ‪low [ v ]  min  d [ u ],‬‬
‫‪ low [ u ],‬‬
‫‪ u‬בן של ‪ v‬בעץ‬
‫‪‬‬
‫(נבצע את החישוב בזמן הסיום של הקודקוד‪).‬‬
‫‪6‬‬
‫דוגמת הרצה‬
 d [v ]

low [ v ]  min  d [ u ], ‫ ( קשת אחורית בעץ‬v , u )
 low [ u ],
‫ בעץ‬v ‫ בן של‬u

a[1]
b
a
d[4]
b[2]
c
e
d
g
f
c[3]
e[5]
f[6]
g[7]
7
‫אילו קודקודים מנתקים?‬
‫‪ ‬טענה‪ :‬קודקוד ‪ v‬שאינו שורש או עלה בעץ הינו קודקוד מנתק‬
‫אמ"מ קיים ‪ u‬בן של ‪ v‬אשר עבורו מתקיים ] ‪.low [ u ]  d [ v‬‬
‫]‪a[1‬‬
‫‪b‬‬
‫‪a‬‬
‫]‪d[4‬‬
‫]‪b[2‬‬
‫‪c‬‬
‫]‪c[3‬‬
‫]‪e[5‬‬
‫]‪f[6‬‬
‫‪8‬‬
‫]‪g[7‬‬
‫‪d‬‬
‫‪g‬‬
‫‪f‬‬
‫‪e‬‬
‫אילו קודקודים מנתקים?‬
‫‪ ‬טענה‪ :‬קודקוד ‪ v‬שאינו שורש או עלה בעץ הינו קודקוד מנתק‬
‫אמ"מ קיים ‪ u‬בן של ‪ v‬אשר עבורו מתקיים ] ‪.low [ u ]  d [ v‬‬
‫נניח ש ‪ v‬קודקוד מנתק שאינו שורש או עלה אז‬
‫‪ ‬הוכחה‪:‬‬
‫כשנריץ ‪ ,DFS‬לא תהיה קשת אחורית מצאצא של ‪ v‬לאב‬
‫קדמון של ‪ . v‬ערכי ה‪ d [ w ] -‬של כל צאצאיו יהיו גדולים מ‪ -‬או‬
‫שווים ל‪ d [v ] -‬ולכן מהגדרת ‪ low‬נקבל את הטענה‪.‬‬
‫נניח שקיים ‪ u‬בן של ‪ v‬אשר עבורו מתקיים‬
‫] ‪ .low [ u ]  d [ v‬אז אין קשת אחורית מאף צאצא של ‪ u‬לקודקוד‬
‫מעל ‪ v‬בעץ ולכן ‪ v‬קודקוד מנתק‪.‬‬
‫‪9‬‬
‫אילו קודקודים מנתקים?‬
‫‪ ‬שאלה‪ :‬עבור אילו קודקודים מתקיים‬
‫] ‪low [ u ]  d [ v‬‬
‫]‪a[1‬‬
‫]‪d[4‬‬
‫]‪b[2‬‬
‫]‪c[3‬‬
‫]‪e[5‬‬
‫]‪f[6‬‬
‫‪10‬‬
‫]‪g[7‬‬
‫?‬
‫קבוצת מוצא‬
‫‪G  V , E ‬‬
‫‪ ‬הגדרה‪ :‬קבוצת קודקודים ‪ S‬בגרף מכוון‬
‫נקראת קבוצת מוצא אם יש ממנה מסלול לכל קודקוד‬
‫בגרף‪ .‬ז"א‬
‫‪v  V , s  S , s ~  v‬‬
‫‪11‬‬
‫שאלה ‪ – 2‬קודקודי מוצא‬
‫‪.G  V , E ‬‬
‫‪ ‬תרגיל‪ :‬נתון גרף מכוון‬
‫למציאת קבוצת מוצא מינימאלית‪.‬‬
‫‪12‬‬
‫תארו אלג'‬
‫שאלה ‪ – 2‬פתרון‬
‫‪ ‬תאור האלגוריתם‪:‬‬
‫◦ נחשב רק"חים‪.‬‬
‫◦ נבחר קודקוד אחד מכל רק"ח שאין אף קשת שנכנסת‬
‫אליו (להלן‪ ,‬רק"ח כזה יכונה מקור)‪.‬‬
‫‪13‬‬
‫פתרון יותר מפורט – גרף העל‬
‫‪ ‬הגדרה‪ :‬גרף העל‬
‫◦ בהנתן גרף מכוון ‪ ,G  V , E ‬גרף העל של ‪ G‬מכיל קודקוד‬
‫עבור כל רק"ח של ‪ .G‬עבור כל זוג רק"חים שיש ביניהם לפחות‬
‫קשת אחת‪ ,‬תהיה קשת (יחידה) בין הקודקודים המייצגים את‬
‫הרק"חים הנ"ל‪.‬‬
‫‪14‬‬
‫פתרון יותר מפורט‬
‫‪ ‬נבנה את גרף העל‬
‫◦ נחשב רק"חים (כמו שנלמד בשיעור – ‪ ,DFS‬הפיכת‬
‫קשתות ושוב ‪.)DFS‬‬
‫‪15‬‬
‫פתרון יותר מפורט‬
‫‪ ‬נבנה את גרף העל‬
‫◦ נחשב רק"חים (כמו שנלמד בשיעור – ‪ ,DFS‬הפיכת‬
‫קשתות ושוב ‪.)DFS‬‬
‫‪c‬‬
‫‪a‬‬
‫‪d‬‬
‫‪b‬‬
‫‪16‬‬
‫פתרון יותר מפורט‬
‫‪ ‬קיבלנו את גרף העל‬
‫◦ גרף העל הוא אציקלי‪.‬‬
‫◦ לכן‪ ,‬ניתן למיין אותו טופולוגית‪.‬‬
‫‪c‬‬
‫‪a‬‬
‫‪c‬‬
‫‪a‬‬
‫‪d‬‬
‫‪b‬‬
‫‪d‬‬
‫‪b‬‬
‫‪17‬‬
‫פתרון יותר מפורט‬
‫‪ ‬נמצא את קבוצת המקורות ‪: S‬‬
‫‪ ‬נעבור על קודקודי הגרף לפי הסדר הטופולוגי שלהם‪,‬‬
‫ועבור כל קודקוד ‪ v‬שנעבור בו‪ ,‬נסמן את הקודקודים‬
‫שיש ממנו קשת אליהם‪.‬‬
‫‪ ‬כאשר נגיע לקודקוד שאינו מסומן‪ ,‬נכניס את אחד‬
‫מקודקודי הרק"ח שהוא מייצג ל‪. S -‬‬
‫‪c‬‬
‫‪d‬‬
‫‪b‬‬
‫‪f‬‬
‫‪18‬‬
‫‪e‬‬
‫‪a‬‬
‫הוכחת נכונות‬
‫‪ ‬נוכיח שמתקיים ‪ v  V ,  s  S , s ~  v‬‬
‫◦ אם ‪ v‬נמצא ברק"ח של מקור‪ ,‬מההגדרה קיים ‪.s ~  v‬‬
‫◦ אחרת‪ ,‬קיים רק"ח אחר ‪ c‬אשר יוצאת ממנו קשת אל‬
‫הרק"ח של ‪ . v‬נחצה את הקשת הזו אל ‪. c‬‬
‫◦ נמשיך לחצות רק"חים באותו אופן‪ ,‬עד אשר נגיע‬
‫למקור‪ .‬מהגדרת האלג'‪ ,‬מקור זה מכיל קודקוד ‪, s  S‬‬
‫ומתקיים ‪.s ~  v‬‬
‫‪c‬‬
‫‪d‬‬
‫‪b‬‬
‫‪19‬‬
‫‪f‬‬
‫‪e‬‬
‫‪a‬‬
‫הוכחת נכונות‬
‫‪ ‬נוכיח שהקבוצה שבחרנו מינימאלית‪.‬‬
‫◦ נסמן את מספר הרק"חים של מקורות בגרף ב‪ . m -‬ניקח‬
‫קבוצה ‪ P‬של ‪ m‬קודקודים – אחד מכל מקור‪.‬‬
‫◦ לא קיים קודקוד בגרף שממנו ניתן להגיע לשני קודקודים‬
‫של ‪ . P‬לכן‪. S  m ,‬‬
‫◦ היות והקבוצה שמצאנו גם היא בגודל ‪ , m‬היא מינימאלית‪.‬‬
‫‪c‬‬
‫‪d‬‬
‫‪b‬‬
‫‪20‬‬
‫‪f‬‬
‫‪e‬‬
‫‪a‬‬
‫סיבוכיות‬
‫‪ ‬חישוב רק"חים – ‪‬‬
‫‪.O  E  V‬‬
‫‪ ‬מציאת מקורות – ‪‬‬
‫‪.O  E  V‬‬
‫‪ ‬סה"כ זמן ריצה של האלג' – ‪‬‬
‫‪21‬‬
‫‪.O  E  V‬‬
‫שאלה ‪ – 3‬תחנות במסלול‬
‫‪ ‬תרגיל‪ :‬נתונים גרף מכוון ‪ G  V , E ‬וקבוצה‬
‫‪ .S  V‬תארו אלג' אשר בודק האם קיים בגרף הילוך‬
‫העובר דרך כל קודקודי ‪ . S‬ההילוך יכול לעבור‬
‫בקודקודים נוספים ואף לחצות את אותה קשת מספר‬
‫פעמים‪.‬‬
‫‪22‬‬
‫שאלה ‪ – 3‬פתרון‬
‫‪ ‬האלגוריתם‪:‬‬
‫◦ נמצא את הרק"חים של הגרף‪.‬‬
‫◦ נחפש בגרף העל מסלול אשר עובר דרך כל הרק"חים המכילים‬
‫לפחות איבר אחד מ‪( S -‬להלן נכנה אותם בתור הרק"חים‬
‫הרלוונטיים)‪.‬‬
‫◦ נרחיב את המסלול להילוך ע"י הרצת‬
‫‪( DFS‬ייתכן מספר פעמים) בתוך‬
‫כל רק"ח‪.‬‬
‫‪23‬‬
‫המשך פתרון‬
‫‪ ‬ניצור את גרף העל ונמיין טופולוגית‪:‬‬
‫‪d‬‬
‫‪e‬‬
‫‪c‬‬
‫‪a‬‬
‫‪f‬‬
‫‪d‬‬
‫‪b‬‬
‫‪g‬‬
‫‪e‬‬
‫‪c‬‬
‫‪a‬‬
‫‪f‬‬
‫‪a‬‬
‫‪e‬‬
‫‪g24‬‬
‫‪d‬‬
‫‪c‬‬
‫‪b‬‬
‫‪f‬‬
‫‪b‬‬
‫‪g‬‬
‫המשך פתרון‬
‫‪ ‬נראה כיצד לחפש מסלול שעובר דרך כל הרק"חים‬
‫הרלוונטיים‪:‬‬
‫◦ נטייל על גרף העל לפי הסדר הטופולוגי‪.‬‬
‫◦ בכל פעם שנגיע לאיבר המייצג רק"ח רלוונטי‪ ,‬נבדוק האם קיים‬
‫מסלול ממנו אל הרק"ח הרלוונטי הבא (בסדר הטופולוגי)‪.‬‬
‫◦ חיפוש מסלול מקודקוד ‪ v‬אל קודקוד ‪ u‬יתבצע באמצעות‬
‫‪ BFS‬מ‪ v -‬על תת הגרף בין ‪ v‬לבין ‪.u‬‬
‫‪f‬‬
‫‪a‬‬
‫‪e‬‬
‫‪25‬‬
‫‪g‬‬
‫‪d‬‬
‫‪c‬‬
‫‪b‬‬
‫נכונות האלגוריתם‬
‫‪‬‬
‫‪26‬‬
‫הוכחה‪:‬‬
‫אם יש הילוך שעובר דרך כל קודקודי ‪ S‬אז האלגוריתם‬
‫ימצא הילוך כזה‪ ,‬כי מספיק למצוא מסלול שעובר דרך‬
‫כל רק"ח‪.‬‬
‫אם האלגוריתם מוצא מסלול מתאים‪ ,‬נבחר מסלול‬
‫מתאים בגרף המקורי‪ ,‬וכיוון שניתן להגיע מכל קודקוד‬
‫לכל קודקוד אחר ברק"ח‪ ,‬ניתן להרחיב אותו להילוך‬
‫מתאים שעובר דרך כל קודקודי ‪. S‬‬
‫השתמשנו בעובדה שניתן לחזור על‬
‫‪ ‬שימו לב שב‪-‬‬
‫קשתות‪.‬‬
‫סיבוכיות‬
‫‪ ‬מציאת רק"חים ‪ +‬מיון טופולוגי – ‪‬‬
‫‪.O  V  E‬‬
‫‪ ‬מציאת רכיבי הקשירות הרלוונטיים‪:‬‬
‫◦ ניתן לבצע תוך כדי מציאת הרק"חים – ‪‬‬
‫‪.O  V  E‬‬
‫‪ ‬מציאת מסלול בין הרק"חים הרלוונטיים‪:‬‬
‫◦ כל קודקוד משתתף לכל היותר בשתי ריצות ‪.BFS‬‬
‫◦ כל קשת משתתפת לכל היותר בריצת ‪ BFS‬אחת‪.‬‬
‫◦ סך זמן הריצה של כל פעולות ה‪.O  V  E  – BFS-‬‬
‫‪‬‬
‫‪‬‬
‫‪27‬‬
‫‪ E 1    V 2  E 2   ...  2  V  E‬‬
‫‪1‬‬
‫‪V‬‬
‫‪O  V1  E 1   O  V 2  E 2   ...  O  V  E‬‬