פתרונות 2 אלגוריתמים תרגיל בית

‫אלגוריתמים תרגיל בית ‪ 2‬פתרונות‬
‫שאלה ‪1‬‬
‫מצאו רק"חים‪ ,‬ובדקו אם יש 𝑘 רק"חים שאין אף קשת שיוצאת ממנו‪ .‬אם כן‪ ,‬החזירו קודקוד אחד מכל רק"ח‪.‬‬
‫שאלה ‪( 2‬פתרון מלא)‬
‫א‪ .‬נגדיר את ‪ W‬כקבוצת הקודקודים המבוקשת‪ ,‬ונאתחל ∅ = ‪ .W‬מכל קודקוד 𝑉 ∈ 𝑣‪ ,‬נריץ ‪ BFS‬ונבדוק אם‬
‫ניתן להגיע ממנו לבדיוק 𝑘 קודקודים נוספים‪ .‬אם כן‪ ,‬נוסיף את 𝑣 ל‪ .W-‬נשים לב שאם הגענו ל ‪𝑘 + 1 -‬‬
‫קודקודים‪ ,‬נוכל לעצור את ריצת ה ‪ BFS‬כי 𝑣 לא יתווסף ל‪ . W-‬זמן הריצה של ‪ BFS‬על 𝑘 קודקודים הוא‬
‫) ‪ 𝑂(𝑘 2‬ולכן זמן הריצה של ‪ BFS‬יהיה ) ‪ 𝑂(𝑘 2‬לכל קודקוד‪ ,‬וסך הכל נקבל שסיבוכיות האלגוריתם היא‬
‫)|𝑉| ‪.𝑂(𝑘 2‬‬
‫ב‪ .‬נגדיר ונאתחל את ‪ W‬כמו בסעיף א'‪ .‬נריץ ‪ DFS‬על ‪ G‬ונמצא רכיבי קשירות‪ .‬נכניס את קודקודי רכיב‬
‫קשירות ‪ 𝐺′‬ל‪ W-‬אמ"ם יש בו ‪ 𝑘 + 1‬קודקודים‪ .‬זמן הריצה הוא של ‪ + BFS‬זמן מעבר על כל הקודקודים‪:‬‬
‫)|𝐸| ‪.𝑂(|𝑉| +‬‬
‫שאלה ‪3‬‬
‫נחזיק משתנה 𝑡𝑜𝑜𝑟‪ ,‬ונאתחל אותו להיות השורש הראשון של ה ‪ DFS‬שלנו‪ .‬כשגיע לקודקוד 𝑣‪ ,‬נעדכן‬
‫𝑡𝑜𝑜𝑟 = )𝑣(𝑡𝑜𝑜𝑟‪ .‬כשחליף שורש‪ ,‬נעדכן את 𝑡𝑜𝑜𝑟 ‪.‬‬
‫שאלה ‪4‬‬
‫נמצא את גרף העל ‪ ,G′‬ולכל רכיב קשירות ‪, 𝑣′ ∈ 𝐺′‬נסמן את מספר הקודקוד הקטן ביותר 𝐺 ∈ 𝑣 ברכיב הקשירות‬
‫ע"י )‪ .𝑦𝑜𝑢𝑛𝑔(𝑣′‬נמיין את ‪ G′‬טופולוגית‪ ,‬נעבור עליו מהסוף להתחלה ונעדכן לכל קודקוד את )𝑣(𝜌‪.‬‬
‫שאלה ‪5‬‬
‫נשים לב שלכל הקשתות חוץ משלוש הקשתות הקלות ביותר יש משקלים שונים‪ .‬לפי פעולת קרוסקל‪ ,‬כל אחת‬
‫מהקשתות הקלות ביותר יכולה להיות בעפ"מ‪ .‬נריץ פרים‪ ,‬ניקח את כל הקשתות שנבחרו‪ ,‬ונוסיף את הקשת‬
‫הקלה ביותר הנוספת‪ ,‬אם היא לא נבחרה ע"י פרים‪.‬‬
‫שאלה ‪6‬‬
‫א‪.‬‬
‫‪G‬‬
‫‪s‬‬
‫ב‪.‬‬
‫‪T‬‬
‫‪s‬‬
‫שאלה ‪7‬‬
‫א‪ .‬נניח שיש סידור אחר אז קיימת קשת בכוון הלא נכון‪.‬‬
‫ב‪ .‬נכון ‪.‬מספיק להוכיח את הלמה הבאה‪ :‬אם אין קשת בין ‪ 2‬קודקודים צמודים במיון הטופולוגי‪ ,‬ניתן להחליף‬
‫ביניהם ולקבל מיון טופולוגי תקין‪.‬‬
‫שאלה ‪8‬‬
‫‪′‬‬
‫)‪′‬‬
‫א‪ .‬נוריד את כל הקשתות 𝑒 אשר עבורם )𝑒(𝑤 ≥ 𝑒(𝑤‪ .‬נבדוק האם קיים מעגל המכיל את הקשת 𝑒 (ע"י‬
‫הורדת )‪ e = (u, v‬והרצת ‪ DFS‬למצוא מסלול מ‪ v -‬ל‪(.u -‬‬
‫משפט‪ :‬קיים מעגל כזה אם"ם אין עפ"מ המכיל את ‪. e‬‬
‫הוכחה‪ >= :‬נניח שקיים מעגל כזה‪ .‬נניח בשלילה ש )‪ e = (u, v‬היא חלק מעפ"מ ‪ .T‬נוריד את ‪ e‬ונקבל‬
‫שני רכיבי קשירות‪ .‬נוסיף את אחת מקשתות המעגל שמחברות בין רכיבי הקשירות של 𝑢 ו‪( v -‬קיימת‬
‫לפחות אחת כזאת)‪ .‬קיבלו עץ עם משקל קטן מ‪.T -‬‬
‫<=נניח שאין אף עפ"מ המכיל את )‪ .e = (u, v‬בכל עפ"מ‪ ,‬קיים מסלול מ‪ u -‬ל‪ , v -‬כשמשקלות כל‬
‫הקשתות במסלול קטן מ ‪ ,e‬אחרת האלגוריתם של קרוסקל היה יכול להוסיף את ‪ e‬לעפ"מ כשהיא‬
‫הראשונה במשקל שלה‪ .‬הוספת ‪ e‬למסלול זה סוגרת מעגל בו ‪ e‬היא הקשת הכבדה ביותר‪.‬‬
‫ב‪ .‬נוריד את כל הקשתות ‪ 𝑒 ′‬אשר עבורם )𝑒(𝑤 > ) ‪ .𝑤(𝑒 ′‬נבדוק האם קיים מעגל המכיל את הקשת 𝑒 ע"י‬
‫הרצת ‪ DFS‬שמתחיל בה‪.‬‬
‫משפט‪ :‬קיים מעגל כזה אם"ם קיים עפ"מ שלא מכיל את ‪. e‬‬
‫הוכחה‪ >= :‬נניח שקיים מעגל כזה‪ .‬נניח בשלילה ש 𝑒 היא חלק מכל עפ"מ‪ .‬כמו בסעיף נוריד את ‪ e‬ונוסיף‬
‫את אחת מקשתות המעגל שמחברות בין רכיבי הקשירות של ‪u‬ו‪ v -‬וכיוון שמשקל הקשת שנשארנו איתה‬
‫במקום ‪ e‬קטן שווה למשקל ‪ ,e‬קיבלנו עפ"מ ללא ‪.e‬‬
‫<=נניח שקיים עפ"מ ‪ T‬שלא מכיל את ‪ .e‬נסמן )‪ e = (u, v‬ונביט במסלול מ ‪ v‬ל‪ u -‬ב‪ .T -‬משקל כל‬
‫הקשתות במסלול הזה קטן או שווה למשקל ‪( e‬אחרת האלגוריתם של קרוסקל היה מוסיף את ‪) e‬‬
‫והוספת ‪ e‬למסלול זה סוגרת מעגל‪.‬‬