גירסה 1.00 5.12.2002 אלגוריתמים בתורת הגרפים חלק שני מסמך זה הינו השני בסדרת מסמכים אודות תורת הגרפים, והוא חופף בחלקו לקורס "אלגוריתמים בתורת הגרפים" בטכניון (שאינו מועבר יותר). ברצוני להודות תודה מיוחדת לפרופסור שמעון אבן ז"ל, על העזרה העצומה שעזר לי בהבנת החומר ובשאלות רבות עליהן ענה לי כאשר למדתי את הנושא. שמעון אבן היה מרצה שהערכתי מאוד ותרומתו למסמך זה היתה משמעותית. מקורות: המסמך מבוסס במידה רבה על הרצאותיו של פרופסור שמעון אבן משנת 2002 וכן על שאלות רבות עליהן שמעון אבן ענה לי. ספרו של שמעון אבן מ- 1979, Graph Algorithms פרקים מספרו החדש של שמעון אבן, שפורסמו בשנת 2002 חלקים מהרצאות וידאו של פרופסור ראובן בר יהודה בנושא אלגוריתמים בתורת הגרפים. המסמכים כוללים נקודות רבות ממקורות אלו, ובנוסף תובנות רבות, דוגמאות ורעיונות שאספתי במהלך לימוד הקורס. עמוד 1
עצים יהי (E G(V, גרף לא מכוון (סופי או אינסופי). נאמר כי G חסר מעגלים אם אין מעגלים פשוטים ב- G. יהי (E G(V, גרף לא מכוון (סופי או אינסופי). נאמר כי G הוא עץ אם הוא קשיר וחסר מעגלים. משפט יהי גרף (E,G(V, אזי כל הטענות הבאות שקולות: א. G עץ. ב. G חסר מעגלים, והוספת קשת כלשהי בהכרח תיצור מעגל ("חסר מעגלים מקסימלי"). ג. G חסר חוגים עצמיים ולכל שתי צמתים, יש מסלול פשוט יחיד ביניהם המחבר אותן. ד. G קשיר, וכל השמטת קשת תפגום בקשירות ("קשיר מינימלי"). הוכחה. a b c d נוכיח a. G קשיר וחסר מעגלים (עץ). G חסר מעגלים והוספת קשת כלשהי אליו בהכרח תיצור מעגל. a b נתון: צ"ל: y לפי ההוספה היה מסלול. x נניח שנוסיף קשת y הקשירות, ומכאן שאחרי הוספה של קשת כלשהי יתקבל מעגל.... x עקב. b c נתון: G חסר מעגלים וכן כי הוספת קשת כלשהי בהכרח תיצור מעגל. צ"ל: G חסר חוגים עצמיים ולכל שתי צמתים, יש מסלול פשוט יחיד ביניהם המחבר אותן. טריוואלי כי G חסר חוגים עצמיים, מכיוון שהנתון כי G חסר מעגלים גורר באופן מיידי שהוא חסר חוגים עצמיים. צריך כעת להוכיח כי בין שני צמתים קיים מסלול. ידוע כי הוספת קשת בין כל שני צמתים,x y תגרום להופעת מעגל. ידוע שהמעגל יהיה מעגל בין x אל y ולאחר מכן בחזרה אל x. מכאן אנו יודעים שהיה קיים המסלול בין x אל y, בו נצעד במעגל שנוצר. נרצה להוכיח יחידות, שקיים רק מסלול אחד כזה. עמוד 2
נניח שקיימים שני מסלולים המחברים בין x אל y, שהם שני הצמתים הכי קרובים אחד אל השני המקיימים את התכונה, שקיימים שני מסלולים המחברים ביניהם. אם המסלולים מתנגשים ביניהם בדרך, נגדיר מחדש את x ו- y אל נקודות ההתנגשות. אם המסלולים לא מתנגשים, הרי שיש בידינו מעגל, בסתירה לנתון. c d נתון: צ"ל: G חסר חוגים עצמיים ולכל שתי צמתים, יש מסלול פשוט יחיד ביניהם המחבר אותן. G קשיר, וכל השמטת קשת תפגום בקשירות ("קשיר מינימלי"). הקשירות מתקבלת באופן טריוואלי, כי בין כל שתי צמתים קיים מסלול. צריך להוכיח כעת כל השמטת קשת תפגום בקשירות. נניח בשלילה שקיימת קשת שניתן להשמיטה מבלי לפגוע בקשירות. אזי קיימת קשת נוספת המקשרת בין x ל- y, ומכאן שקיים מעגל, בסתירה לנתון. d a נתון: G קשיר, וכל השמטת קשת תפגום בקשירות ("קשיר מינימלי"). צ"ל: G עץ - גרף קשיר וחסר מעגלים. מכיוון שהקשירות נתונה, צריך רק להוכיח כי G חסר מעגלים. אם קיים מעגל, הרי שקיימת קשת שניתן להסירה - כל קשת כלשהי על המעגל ניתנת להשמטה - ועדיין לשמור על הקשירות - עדיין קיים מסלול בין הצמתים. משפט. V יהי גרף G(V,E) סופי, כך ש n אזי, הטענות הבאות שקולות: =. E = n 1. E א. G עץ. ב. G חסר מעגלים, וגם ג. G קשיר, וגם 1 n = עלה הוא צומת שדרגתו 1. טענה לכל עץ סופי לא טריויאלי, יש לפחות שני עלים. עמוד 3
עצים מכוונים r. נאמר כי r הוא שורש אם ניתן להגיע יהי (E G(V, גרף מכוון, ותהי צומת R מ- r אל כל צומת, v V כלומר אם קיים מ- r מסלול מכוון אל כל אחת מהצמתים בגרף. הערה בגרף קשיר היטב, כל הצמתים הינן שורשים. G הוא עץ מכוון אם יש לו שורש וגרף התשתית שלו הינו עץ. משפט d ( ) 0 in r = יהי G גרף מכוון, אזי הטענות הבאות שקולות. G הוא עץ מכוון. 1. יש ב- G שורש וממנו מסלול יחיד לכל צומת. 2. v r, d ( ) 0 = r din וגם v) 1 in( יש שורש,r כך ש:.3 יש ל- G שורש, והשמטת קשת תקלקל זאת. 4. גרף התשתית של G קשיר, וקיים צומת r, כך ש- 5. משפט. =. v r, d ( v) = 1 in וגם יהי (E G(V, גרף מכוון סופי. נאמר כי (E G(V, הינו עץ מכוון אמ"מ גרף התשתית שלו חסר מעגלים, וכן קיימת צומת אחת עבורה = r, d ועבור כל שאר הצמתים מתקיים: = v d in ( ) 1 in ( ) 0 עמוד 4
אינדוקציה, שמורות והוכחות נוכחות של תוכניות אינקודציה חד ממדית דוגמא נתונה שורת אבני דומינו ואצבע. מהו תנאי מספיק כדי שכל הדומינו יפלו? תשובה אפשרית נוכיח כי הראשון נופל, ונוכיח כי אם מישהו כלשהו נופל, זה שאחריו נופל. אם נוכיח זאת, הוכחנו שכל הדומינו יפלו. דוגמא בהינתן אינדקס של מספר סידורי כלשהו בסידרת פיבונצי, מהו תנאי מספיק על מנת שנוכל למצוא את מספר הפיבונצי המתאים לו? במקרה זה נצטרך שני תנאי התחלה - קיום איבר ראשון וקיום איבר שני. באמצעותם נוכל למצוא לכל n את מספר הפיבונצי המתאים לו. דוגמאות אלו הינן דוגמאות לאינדוקציה חד ממדית. אינדוקציה דו ממדית דוגמא. A נתון שעכבר אחד חולה במחלה n n עכברים יושבים לאורך משבצות של לוח שח - מדבקת. מה התנאים שהמחלה תתפשט על הלוח? על מנת להשיב, צריך לדעת איך המחלה מתפשטת למשל, נוכל להגדיר כי בכל. Ai, j נשים לב שעם תנאי כזה, הבעיה היא למעשה אינדוקציה A i, j + 1 יחידת זמן, חד ממדית. תנאי אחר יכול להיות למשל:. A A + + i, j i 1, j 1 עמוד 5
קשר בין אינדוקציה אל מדעי המחשב אלמנטים רבים במדעי המחשב מתבססים על אינדוקציה. לולאות, רקוסיה וכו', כולם מתבססים על אינדוקציה. דוגמא xi i נניח כי נרצה לחשב את הביטוי: נציע פתרון: s = 0; for (i = 0; i < N; ++i) { s = s + x i ; } אתחול: צעד: השמורה: אתחל את s ב- 0.. x i הוסף בצעד ה- i של האלגוריתם, יש ב- s את סכום כל האיברים עד המקום הנוכחי. האתחול נועד לקיים את השמורה, והוא בעצם טוען כי סכומם של 0 איברים הוא 0. x i נניח כעת כי במקום חיבור, היינו צריכים להכפיל אתחול: אתחל את s ב- 1. צעד: הכפל ב-. איברים. x i בצורה דומה נטפל בבעיות רבות אחרות בסגנון: = AND 1 s= s and x i = or 0 s= s or x i MIN s= min( s, x i ) MAX s= max( s, x i ) x i 1 s= s x i x i 0 s= s+ x i רוצים לחשב אתחול צעד עמוד 6
דוגמא מצא: 107, % 10 תוך כדי שימוש רק בפעולת חיסור. פתרון: נחסר 10 מ- 107, ונקבל 97. לאחר מכן, נחסר 10 מ- 97 ונקבל 87, וכך הלאה.. x mod10= השמורה שלנו: אם בצעד ה- i אנו מגיעים אל, אזי מתקיים x mod10 i x i דוגמא יהי G גרף בעל דרגות זוגיות וקשיר. ידוע כי יש בו מעגל אויילרי. נרצה למצוא אלגוריתם המוצא אותו. פתרון: ניקח מצב באמצע התוכנית: הנחת האינדוקציה: יש לנו מעגל, שנוצר על ידי טיול ממצה. הנחה נוספת - אם יש קשת שבה עדיין לא ביקרנו, היא נוגעת בקשת כלשהי שביקרנו בה (נובע מקשירות הגרף). הנחה שלישית - הדרגות של הצמתים בהם לא ביקרנו זוגיות. בסיס: בתחילה כל הגרף מקיים את הנחת האינדוקציה. עמוד 7
V V, E E עץ פורש מינימום יהי הגרף נאמר כי הגדרות,G( V, E) G ( V, E ) ויהי הגרף E הינו תת גרף של אם מתקיים כי. G ( V, ) G( V, E) תת גרף מושרה צמתים של (E G(V, הוא גרף הנקבע על ידי בחירת צמתים מהגרף G, ולאחר מכן בחירה של כל הקשתות המחברות בין הצמתים שנבחרו. תת גרף מושרה קשתות של (E G(V, הוא גרף הנקבע על ידי בחירת קשתות מהגרף G, ולאחר מכן בחירה של הצמתים אליהם הקשתות מחוברות. יהי הגרף (E )G V, גרף סופי, קשיר, לא מכוון, ובו מתקיים כי לכל צומת, e E E E נניח כי נמצא.l( e ) > 0, כך ש- e E l( e) קשיר וגם G ( V, E ) מינימלי. מכיוון שאנו מניח כי G קשיר, וכן שאורך קשתותיו מינימלי, הרי נוכל לומר גם כי הוצאת כל קשר תקלקל את הקשירות. מכיוון שכך, ולפי המשפט הראשון שראינו על עצים, נובע כי G עץ. עץ המקיים תכונות אלו נקרא עץ פורש מינימום.. X חלוקה של קבוצה G הינה שתי קבוצות זרות,X, Y כך ש Y=G משפט יהי גרף E),G( V, ותהי X, Y חלוקה של.V e הקשת הקטנה ביותר המחברת צומת מ- X אל צומת מ- Y, אזי קיים עץ תהי E פורש מינימום הכיל את. e עמוד 8
האלגוריתם של Prim למציאת עץ פורש מינימום Procedure PRIM(G, l, T ) for every v V do λ( v) choose a vertex s V λ( s) 0 ε( s) φ TEMP V T φ while TEMP φ do choose a vertex v TEMP for which λ( v) is minimum TEMP TEMP\ { v} T T ε( v) e for every v u do if u TEMP and λ( u) > l( e) then do λ( u) l( e) ε( u) { e} T הינו תת גרף של G, שהוא עץ. TEMP זוהי קבוצת צמתים, שעדיין לא ב- T במהלך האלגוריתם. הרעיון של האלגוריתם: אנו מתחילים מצומת אחת, וכל בפעם מוסיפים עלה חדש, v אל העץ T, עד שכל הצמתים צורפו אליו. כאשר אנו מצרפים צומת חדש ל- T, אנו בודקים את כל הקשתות המחוברות אליו. אנו שומרים מהי הקשת הקצרה ביותר המחברת אל T, ושומרים את האורך שלה ואת הקשת עצמה. מכיוון כי G קשיר, כאשר האלגוריתם מסתיים T מכיל עץ פורש. טענה העץ T המתקבל מהאלגוריתם של PRIM הינו עץ פורש מינימום של G. עמוד 9
משפט Cayley משפט זה והטענות הנלוות אליו עוסקים במספר העצים הפורשים של גרף נתון.. V = { 1, 2,..., n} נניח כי העצים נוצרים על ידי קבוצת צמתים נתונה - עבור 2=n, ניתן ליצור רק עץ פורש יחיד. עבוד =n 3, ישנם 3 עצים אפשריים: 1 1 1 3 2 3 2 3 2 משפט n 2 מספר העצים הפורשים עבור גרף בעל n צמתים הינו n. האלגוריתם של Kruskal למציאת עץ פורש מינימום להלן האלגוריתם של Kruskal למציאת עץ פורש מינימום של גרף לא-מכוון וקשיר : l : E R בעל פונקצית אורך על הקשתות G (1) sort E in non-decreasing order of length, let e 1, e2,..., e E be the sorted edges (2) T φ (3) for j, starting with j=1 and ending with j= E, do: (4) if V, T { e }) is circuit-free, then ( j (5) T T e } { j תהי A T עבור איזשהו עץ פורש מינימום T. קשת e תקרא בטוחה עבור A אם. A { e} קיים עץ פורש מינימום `T כך ש: `T הבחנה: A כנ"ל מגדירה עץ פורש מינימום אם ורק אם אין ב- E קשתות בטוחות עבור A. טענה,S ( חלוקה. אם u ו- v נמצאים בצדדים שונים של החלוקה, אזי כל מסלול יהי ) S בינם מכיל לפחות קשת חתך אחת. טענה עמוד 10
אם נוסיף לעץ פורש קשת חדשה e ונוציא מהמעגל שנסגר קשת כלשהי `e, אזי נקבל עץ פורש. משפט,S ( חלוקה אשר אינה מכילה תהי A T עבור איזשהו עץ פורש מינימום T, ויהי ) S S, ( היא אף קשת מ- A. אזי הקשת e בעלת האורך המינימלי ביותר בחלוקה ) S בטוחה עבור A. הוכחה e p.a בטוחה עבור e ולכן A { e} אם e T אז בוודאי T u,, e = ( אזי אחרת. e T אם נוסיף את e ל- T ייסגר מעגל פשוט יחיד. נניח כי (v מבחירת e מתקיים כי הצמתים u ו- v נמצאים בצדדים שונים של החלוקה, והמעגל ו- v u הוא המסלול הפשוט היחיד בין (p u הפשוט היחיד שנסגר ב- T הוא: v ~ u ב- T ). לפי טענה 1, במסלול p יש לפחות קשת חתך אחת, `e. אזי לאחר הוספת e ל- T, נוציא את הקשת `e שנמצאת על המעגל הפשוט היחיד שנסגר. לפי טענה 2 קיבלנו עץ פורש, שנסמנו `T. הקשת `e אינה ב- A (משום שהקשת `e היא קשת חתך ולפי. A { e`} `T מתקיים: ולכן אינו מכילה אף קשת מ- A ). (,S הנתונים החלוקה ) S כל שנותר להראות הוא ש- `T הוא עץ פורש מינימום. (e )l. לכן מתקיים: l( e`) ולכן, ( S, הקשת e היא מינימלית בחלוקה ) S w( T ) w( T`) = w( T ) + l( e) l( e`) w( T ) לכן נסיק כי:, כלומר `T עץ פורש מינימום. w ( T`) = w( T ) רעיון האלגוריתם של Kruskal ניתן לראות שבתחילת האלגוריתם כל צומת מהווה רכיב עצמאי. בכל שלב של האלגוריתם אנו מוצאים קשת קלה ביותר אשר מחברת שני רכיבים שונים, ומוסיפים אותה לעץ הפורש (תוך "איחוד" שני הרכיבים שהיא חיברה לרכיב אחד חדש). אנו למעשה מוסיפים לקבוצה T רק קשתות שבטוחות עבורה. לפי המשפט אשר הוכחנו וההבחנה מה של קשת בטוחה, יתקיים כי בסיום האלגוריתם הקבוצה T מכילה עץ פורש מינימום של G. סיבוכיות.O( סיבוכיות האלגוריתם היא: ) E E log עמוד 11
למת ה- של קנינג אם G הוא גרף אין סופי (מכוון) עם שורש r, ודרגות יציאה סופיות לכל צומת, אז יש מסלול מכוון אינסופי המתחיל ב- r. הערה אם דרגת היציאה הייתה יכולה להיות אינסופית, הטענה לא הייתה נכונה. דוגמא: נניח נתונה צומת אחת r שמחוברת ל- צמתים 1, 3, 2,..., שכל אחת מהן היא עלה. במקרה זה איננו יכולים להרכיב מסלול מכוון אינסופי. הוכחת הלמה נבנה תת גרף T שהוא עץ פורש מכוון של G, בצורה הבאה: נמחק את כל הקשתות הנכנסות אל השורש. ) 0 = ) r.( din ( -,v0,...,v1 vi המסלול הקצר ביותר מ- r אליו., v = i+ 1 יהי v צומת כלשהו ויהי v ( d ( in v ) = 1 ). v i נמחק את כל הקשתות הנכנסות אל v מלבד זו המגיעה מ- R נשאר השורש של הגרף. מהנחות אלו, נקבל כי T הוא עץ. כעת נוכיח את הלמה עבור העץ, והטענה תהיה נכונה גם עבור הגרף. ל- r מספר סופי של בנים, כמו כן ל- r מספר אינסופי של צאצאים. לכל בן של r מספר מסוים של צאצאים. לאחד מהם לפחות מספר אינסופי של צאצאים, לפי הטענות שהצגנו בשורה הקודמת. נבחר את הבן עם מספר הצאצאים האינסופי. הוא הצומת הבאה במסלול שלנו.. r i נסמנו ב- כעת נוכל להפעיל עליו את אותה הטענה שהפעלנו על r, וכך לקבל את המסלול שלנו. מ.ש.ל עמוד 12
שימושים ריצוף המישור (Wang) מרצפת הינה ריבוע שעל כל צלע שלו אות השייכת לשפה שנבחרה. ניתן לחבר שתי מרצפות רק אם הצלעות שלהן שנוגעות אחת בשניה בעלות אותה אות. ישנם מספר לא מוגבל של מרצפות מכל אחד מהסוגים. מספר הסוגים הוא סופי. השאלה בה נתעניין האם ניתן לרצף את המישור בעזרת המרצפות? זוהי בעיה בלתי כריעה. לא קיים אלגוריתם היודע להכריע אם בהינתן אוסף מרצפות ניתן או לא ניתן לרצף את המישור. עם זאת, Wang הוכיח: אם ניתן לרצף את הרביע הראשון של המישור בעזרת סט נתון וסופי של t סוגי מרצפות, אזי ניתן לרצף את כל המישור. נשים לב שאם מספר סוגי המרצפות שבעזרתן נרצף את הרביע הראשון אינו סופי, טענה זו אינה מתקיימת. דוגמא (הדוגמא לקוחה מחוברת התרגולים של הקורס "אלגוריתמים בתורת הגרפים" בטכניון): נתונה קבוצת המשפחות הבאות של אריחים: לכל זוג סדור של מספרים טבעיים (i,j) יש משפחה של אריחים עם תווית של 1-i בצד מערב, i בצד מזרח, j בצד צפון ו- 1-j בצד דרום. טענה: בעזרת קבוצת משפחות אלו, ניתן לרצף את הרביע הצפון מזרחי. הוכחה: נתייחס לרביע הצפון מזרחי כמערך דו-מימדי אינסופי כאשר בכל תא במערך אנו צריכים לשים אריח בודד. נניח כי מספור התאים של מערך זה הוא מהצורה: (k,m), כאשר הכוונה היא לתא ה- k בשורה ה- m. מספור השורות הוא מ 1, והוא גדל כלפי כיוון צפון. מספור התאים בכל שורה הוא גם מ 1, והוא גדל כלפי כיוון מזרח (כלומר האריח הדרום-מערבי ביותר ברביע הוא האריח (1,1)). נשים בתא ה- (k,m) אריח מהמשפחה.(k,m) זה ריצוף חוקי של הרביע הצפון מזרחי לפי הגדרת משפחות האריחים. טענה: בעזרת קבוצת משפחות אלו, לא ניתן לרצף את כל המישור. הוכחה: נניח בשלילה שכן. נבחר אריח שרירותי בריצוף זה, נניח כי זהו אריח מהמשפחה.(i,j) אזי האריח שנמצא ממערב לאריח זה, הוא בעל תווית מזרחית של 1-i. ולכן זה אריח מהמשפחה.(i-1,j) כעת, נפעיל את אותו השיקול על האריח מהמשפחה,(i-1,j) ונקבל כי משמאלו קיים אריח מהמשפחה.(i-2,j) כך נגיע בסופו של דבר לאריח מהמשפחה (j,0). לאריח שכזה לא ייתכן אריח שכן מכיוון מערב, כי משפחות האריחים מוגדרות רק עבור מספרים טבעיים. לכן קיבלנו כי ממערב לאריח מהמשפחה (i,j) יש בדיוק i אריחים. זאת סתירה לכך שכל המישור מרוצף. עמוד 13