You are on page 1of 14

‫גרפי אוילר‬

Map of Königsberg in Euler's time showing the actual layout of


the seven bridges, highlighting the river Pregel and the bridges.

1
‫‪ ‬מעגל אוילר הוא מעגל העובר פעם אחת בדיוק על כל קשת של הגרף‪.‬‬

‫‪ ‬מסלול אוילר הוא מסלול העובר פעם אחת בדיוק על כל קשת של הגרף‪.‬‬

‫‪2‬‬
‫מעגל אוילר בגרף לא מכוון‬
‫משפט‬
‫כל דרגותיו זוגיות‬ ‫‪‬‬ ‫גרף לא מכוון וקשיר מכיל מעגל אוילר‬

‫הוכחה‬
‫‪ ‬אם גרף לא מכוון וקשיר מכיל מעגל אוילר ‪,‬‬
‫אז בכל פעם שמבקרים בקדקוד עם זוג קשתות חדש ‪,‬‬
‫עם קשת אחת נכנסים אליו ועם השניה יוצאים ממנו ‪ ,‬וזה תורם ‪ 2‬לדרגתו ‪.‬‬
‫לכן לכל קדקודי הגרף יש דרגה זוגית ‪.‬‬

‫‪ ‬ואם לגרף מכוון וקשיר כל הדרגות זוגיות ‪,‬‬


‫נציג אלגוריתם למציאת מעגל אוילר בגרף ‪,‬‬
‫לכן יש לגרף מעגל אוילר ‪.‬‬

‫אלגוריתם למציאת מעגל אוילר בגרף לא מכוון וקשיר שדרגותיו זוגיות‬


‫נצייר מעגל באופן אקראי‪ ,‬החל מקדקוד כלשהו‬ ‫‪.1‬‬
‫( נקבע קדקוד כלשהו כמעגל ריק ) ‪.‬‬
‫כל עוד לא עברנו על כל קשתות הגרף‪:‬‬ ‫‪.2‬‬
‫נמצא על המעגל קדקוד שסמוכות אליו קשתות עליהן טרם‬ ‫א‪.‬‬
‫עברנו‬
‫נצייר מעגל אקראי החל מקדקוד זה ‪ ,‬על קשתות שטרם עברנו‬ ‫ב‪.‬‬
‫ונספח אותו למעגל הקודם במקום קדקוד זה ‪.‬‬ ‫ג‪.‬‬

‫‪3‬‬
‫‪F‬‬

‫נכונות‪ :‬נוכיח שהאלגוריתם מוצא מעגל אוילר‬

‫כל עוד לא עברנו על כל קשתות הגרף ‪ ,‬קיים על המעגל שאנו יוצרים כעת ‪,‬‬ ‫טענת עזר ‪1‬‬
‫קדקוד שסמוכות אליו קשתות עליהן טרם עברנו ‪.‬‬

‫‪‬‬ ‫כי הגרף קשיר ‪.‬‬ ‫הוכחה‬

‫בכל גרף לא מכוון שדרגותיו זוגיות ‪ ,‬ניתן לצייר אקראית מעגל ‪.‬‬ ‫טענת עזר ‪2‬‬
‫הוכחה‬
‫נתחיל מקדקוד ‪ a‬כלשהו שדרגתו לא ריקה‪ .‬יש כזה אחרת ציירנו כבר את כל המעגלים‪.‬‬
‫‪ d(a)2‬ולכן יש לידו קשת ‪ ,‬נניח (‪ . )a,b‬נסיר אותה ‪.‬‬
‫אם ‪ b = a‬ציירנו מעגל וסיימנו ‪ .‬לכן נניח ש‪. b  a -‬‬
‫‪ a,b‬הקדקודים היחידים שדרגתם אי‪-‬זוגית ‪ ,‬ולכן יש ליד ‪ b‬קשת נוספת ‪ ,‬נניח (‪. )b,c‬‬
‫אם ‪ c = a‬ציירנו מעגל וסיימנו ‪ .‬לכן נניח ש‪. c  a -‬‬
‫אחרי הסרת (‪ , )b,c‬הקדקודים היחידים מדרגה אי‪-‬זוגית הם ‪. a,c‬‬
‫לכן יש ליד ‪ c‬קשת נוספת ‪.‬‬
‫וכך הלאה (תהליך רקורסיבי – הוכחה באינדוקציה) ניתן להמשיך ‪.‬‬

‫‪4‬‬
. a ‫והרי ניתן לעצור רק כאשר נגיע חזרה אל‬
 . ‫וציירנו מעגל אקראית‬
‫ מבני נתונים קוד ויעילות‬:‫אוילר‬
Euler Circuit

EULER(graph G=(V,E) )
// Find an Euler circuit.
L  {v} // vV any vertex ,{v} - an empty circuit

while there is a vertex on L with unused edges


v  first such vertex on L
L’  Find-Circuit(v)
“paste” L’ into L instead of v
return L

FIND-CIRCUIT(v0)
// Find a circuit starting at v 0. Return list of vertices.
L  {v0} // initialize list
v  v0

repeat
u  a neighbour of v via an unused edge
mark (v,u) used
L  Append(L,u)
vu
until v = v0

return L

5
‫)‪total complexity (E‬‬

‫מסלול אוילר בגרף לא מכוון‬

‫משפט‬
‫כל דרגותיו זוגיות‬ ‫‪‬‬ ‫גרף לא מכוון וקשיר מכיל מסלול אוילר‬
‫פרט ל‪ 2 -‬קדקודים שדרגותיהם אי‪-‬זוגיות‬

‫הוכחה‬
‫‪ ‬אם גרף לא מכוון וקשיר מכיל מסלול אוילר ‪,‬‬
‫אז בכל פעם שמבקרים בקדקוד עם זוג קשתות חדש ‪,‬‬
‫עם קשת אחת נכנסים אליו ועם השניה יוצאים ממנו‪ ,‬וזה תורם ‪ 2‬לדרגתו ‪.‬‬
‫מקדקוד התחלת המסלול יוצאים בהתחלה ולא חוזרים בסוף ‪ ,‬וזה תורם ‪ 1‬לדרגתו‬
‫‪.‬‬
‫אל קדקוד סיום המסלול נכנסים בסוף ולא יוצאים בהתחלה ‪ ,‬וזה תורם ‪1‬‬
‫לדרגתו ‪.‬‬
‫לכן לכל קדקודי הגרף יש דרגה זוגית ‪,‬‬
‫פרט לקדקודי התחלת המסלול וסוף המסלול ‪.‬‬

‫‪ ‬ואם לגרף לא מכוון וקשיר כל הדרגות זוגיות ‪:‬‬


‫פרט לשני קדקודים ‪: s,t‬‬
‫‪ -‬נחבר את ‪ s,t‬בעזרת קשת חדשה ‪.‬‬
‫‪ -‬יתקבל גרף קשיר ולא מכוון שכל דרגותיו זוגיות ‪.‬‬
‫‪ -‬נמצא בו מעגל אוילר ‪.‬‬

‫‪6‬‬
‫‪ -‬אחרי הסרת הקשת החדשה ממעגל אוילר ‪ ,‬יתקבל מסלול אוילר של הגרף ‪.‬‬
‫‪‬‬

‫מעגל אוילר בגרף מכוון‬

‫משפט‬
‫‪‬‬ ‫גרף מכוון‪ ,‬שגרף התשתית שלו קשיר‪ ,‬מכיל מעגל אוילר‬
‫לכל אחד מקדקודיו שווה דרגת הכניסה לדרגת היציאה‬

‫הוכחה‬
‫‪ ‬אם גרף מכוון וקשיר מכיל מעגל אוילר ‪,‬‬
‫אז בכל פעם שמבקרים בקדקוד עם זוג קשתות חדש ‪,‬‬
‫עם קשת אחת נכנסים אליו ועם השניה יוצאים ממנו‪ ,‬וזה תורם ‪ 2‬לדרגתו ‪.‬‬
‫לכן לכל קדקודי הגרף יש דרגה זוגית ‪.‬‬

‫‪ ‬ואם לגרף מכוון וקשיר כל הדרגות זוגיות ‪,‬‬


‫נציג אלגוריתם למציאת מעגל אוילר בגרף ‪,‬‬
‫לכן יש לגרף מעגל אוילר ‪.‬‬

‫אלגוריתם למציאת מעגל אוילר בגרף לא מכוון וקשיר שדרגותיו זוגיות‬


‫נצייר מעגל באופן אקראי‪ ,‬החל מקדקוד כלשהו‬ ‫‪.3‬‬
‫( נקבע קדקוד כלשהו כמעגל ריק ) ‪.‬‬
‫כל עוד לא עברנו על כל קשתות הגרף‪:‬‬ ‫‪.4‬‬

‫‪7‬‬
‫נמצא על המעגל קדקוד שסמוכות אליו קשתות עליהן טרם‬ ‫א‪.‬‬
‫עברנו‬
‫נצייר מעגל אקראי החל מקדקוד זה ‪ ,‬על קשתות שטרם עברנו‬ ‫ב‪.‬‬
‫ונספח אותו למעגל הקודם במקום קדקוד זה ‪.‬‬ ‫ג‪.‬‬

‫נכונות‪ :‬נוכיח שהאלגוריתם מוצא מעגל אוילר‬

‫כל עוד לא עברנו על כל קשתות הגרף ‪ ,‬קיים על המעגל שאנו יוצרים כעת ‪,‬‬ ‫טענת עזר ‪1‬‬
‫קדקוד שסמוכות אליו קשתות עליהן טרם עברנו ‪.‬‬

‫‪‬‬ ‫כי הגרף קשיר ‪.‬‬ ‫הוכחה‬

‫בכל גרף לא מכוון שדרגותיו זוגיות ‪ ,‬ניתן לצייר אקראית מעגל ‪.‬‬ ‫טענת עזר ‪2‬‬

‫הוכחה‬
‫נתחיל מקדקוד ‪ a‬כלשהו שדרגתו לא ריקה‪ .‬יש כזה אחרת ציירנו כבר את כל המעגלים‪.‬‬
‫‪ d(a)2‬ולכן יש לידו קשת ‪ ,‬נניח (‪ . )a,b‬נסיר אותה ‪.‬‬
‫אם ‪ b = a‬ציירנו מעגל וסיימנו ‪ .‬לכן נניח ש‪. b  a -‬‬
‫‪ a,b‬הקדקודים היחידים שדרגתם אי‪-‬זוגית ‪ ,‬ולכן יש ליד ‪ b‬קשת נוספת ‪ ,‬נניח (‪. )b,c‬‬
‫אם ‪ c = a‬ציירנו מעגל וסיימנו ‪ .‬לכן נניח ש‪. c  a -‬‬
‫אחרי הסרת (‪ , )b,c‬הקדקודים היחידים מדרגה אי‪-‬זוגית הם ‪. a,c‬‬
‫לכן יש ליד ‪ c‬קשת נוספת ‪.‬‬
‫וכך הלאה (תהליך רקורסיבי – הוכחה באינדוקציה) ניתן להמשיך ‪.‬‬
‫והרי ניתן לעצור רק כאשר נגיע חזרה אל ‪. a‬‬
‫‪‬‬ ‫וציירנו מעגל אקראית ‪.‬‬

‫‪8‬‬
‫ מבני נתונים קוד ויעילות‬:‫אוילר‬
Euler Circuit

EULER(graph G=(V,E) )
// Find an Euler circuit.
L  {v} // vV any vertex ,{v} - an empty circuit

while there is a vertex on L with unused edges


v  first such vertex on L
L’  Find-Circuit(v)
“paste” L’ into L instead of v
return L

FIND-CIRCUIT(v0)
// Find a circuit starting at v 0. Return list of vertices.
L  {v0} // initialize list
v  v0

repeat
u  a neighbour of v via an unused edge
mark (v,u) used
L  Append(L,u)

9
‫‪vu‬‬
‫‪until v = v0‬‬

‫‪return L‬‬
‫)‪total complexity (E‬‬

‫מסלול אוילר בגרף מכוון‬

‫משפט‬
‫‪‬‬ ‫גרף מכוון‪ ,‬שגרף התשתית שלו קשיר‪ ,‬מכיל מסלול אוילר‬
‫לכל אחד מקדקודיו שווה דרגת הכניסה לדרגת היציאה‬
‫פרט לשני קדקודים ‪ s,t‬המקיימים ‪:‬‬
‫‪dout(s) = din(s) + 1‬‬ ‫‪din(t) = dout(t) + 1‬‬

‫‪10‬‬
‫הוכחה‬
‫‪ ‬אם גרף לא מכוון וקשיר מכיל מסלול אוילר ‪,‬‬
‫אז בכל פעם שמבקרים בקדקוד עם זוג קשתות חדש ‪,‬‬
‫עם קשת אחת נכנסים אליו ועם השניה יוצאים ממנו‪ ,‬וזה תורם ‪ 2‬לדרגתו ‪.‬‬
‫מקדקוד התחלת המסלול יוצאים בהתחלה ולא חוזרים בסוף ‪ ,‬וזה תורם ‪ 1‬לדרגתו‬
‫‪.‬‬
‫אל קדקוד סיום המסלול נכנסים בסוף ולא יוצאים בהתחלה ‪ ,‬וזה תורם ‪1‬‬
‫לדרגתו ‪.‬‬
‫לכן לכל קדקודי הגרף יש דרגה זוגית ‪,‬‬
‫פרט לקדקודי התחלת המסלול וסוף המסלול ‪.‬‬

‫‪ ‬ואם לגרף לא מכוון וקשיר כל הדרגות זוגיות ‪:‬‬


‫פרט לשני קדקודים ‪: s,t‬‬
‫‪ -‬נחבר את ‪ s,t‬בעזרת קשת חדשה ‪.‬‬
‫‪ -‬יתקבל גרף קשיר ולא מכוון שכל דרגותיו זוגיות ‪.‬‬
‫‪ -‬נמצא בו מעגל אוילר ‪.‬‬
‫‪ -‬אחרי הסרת הקשת החדשה ממעגל אוילר ‪ ,‬יתקבל מסלול אוילר של הגרף ‪.‬‬
‫‪‬‬

‫הרחבת גרפי אוילר‬

‫משפט‬
‫אם בגרף לא מכוון וקשיר יש בדיוק ‪ 2k‬קודקודים מדרגה אי‪-‬זוגית‪, k³1 ,‬‬
‫אז ניתן לחלק את קבוצת קשתותיו ל‪ k -‬מסלולים זרים (בקשתות) ‪.‬‬
‫האם ניתן להחליף את תנאי הקשירות לתנאי חלש יותר?‬

‫‪11‬‬
‫הוכחה‬
‫נוסיף לגרף ‪ k‬קשתות ‪ -‬קשת בין כל זוג קודקודים אי‪-‬זוגיים ‪.‬‬ ‫‪-‬‬
‫הגרף החדש מכיל מעגל אוילר‪ ,‬כי כל דרגותיו זוגיות ‪ ,‬ומכיוון ש‪ k -‬הקשתות החדשות זרות‪,‬‬ ‫‪-‬‬
‫הסרתן ממעגל אוילר משאירה ‪ k‬מסלולים זרים בקשתות‪ ,‬המכסות את קשתות הגרף ‪.‬‬

‫ניתן להמיר את הדרישה לגרף קשיר ‪ ,‬ולדרוש שכל רכיב קשירות יכיל קדקודים אי‪-‬זוגיים‪.‬‬
‫הפתרון במקרה זה יתבסס על הפעלה רקורסיבית של הפתרון הקודם על כל רכיב קשירות בנפרד‪.‬‬

‫גרפי המילטון‬

‫‪ ‬מעגל המילטון הוא מעגל העובר פעם אחת בדיוק דרך כל קדקוד של הגרף‪.‬‬
‫‪ ‬מסלול המילטון הוא מסלול העובר פעם אחת בדיוק דרך כל קדקוד של הגרף‪.‬‬

‫️☹‬

‫‪12‬‬
‫מציאת מסלול \ מעגל המילטון בגרפים נחשבת לבעיה "קשה" עבור‬
‫המחשב ‪.‬‬

‫אם כי‬
‫לקבוצות חלקיות מסוימות של גרפים‬
‫ניתן למצוא אלגוריתמים פולינומיאליים‬

‫דוגמאות‬

‫טענה‬
‫‪ ‬יש לו מיון טופולוגי‬ ‫גרף מכוון חסר מעגלים מכיל מסלול המילטון‬
‫יחיד‬

‫החומר ילמד בשיעור הבא‬

‫טענה‬
‫גרף שבו כל שני קדקודים קשורים ע"י קשת מכוונת אחת בדיוק ‪,‬‬
‫מכיל תמיד מסלול המילטון ‪.‬‬

‫הוכחה‬
‫הוכחה באינדוקציה על ‪. n‬‬
‫נסיר מהגרף קדקוד על קשתותיו ‪ .‬יישאר גרף קשיר לחלוטין בן ‪ n-1‬קדקודים ‪.‬‬

‫‪13‬‬
‫ונובע באינדוקציה שהוא מכיל מסלול המילטון ‪,‬שנסמנו ‪. v1,v2,....,vn-1‬‬
‫‪ , vn-1vn‬סיימנו ‪.‬‬ ‫או‬ ‫אם ‪vnv1‬‬
‫‪v1v2....vi-1vi....vn-1‬‬ ‫אחרת יהא ‪ vi‬הראשון ש‪ vn -‬מכוון אליו‪:‬‬

‫‪vn‬‬
‫‪‬‬ ‫אז בגרף זה ‪ v1,v2,....,vi-1,vn,vi,....,vn-1‬הוא מסלול המילטון‪.‬‬

‫אלגוריתם יעיל יוסיף רקורסיבית קדקוד למסלול ההמילטון שהתקבל בשלב הקודם‪ ,‬כמו שהוסבר עתה‪,‬‬
‫עד לקבלת מסלול המילטון על כל קודקודי הגרף‪.‬‬
‫אלגוריתם יעיל יחקה רקורסיבית את האינדוקציה ויוסיף קדקוד אחר קדקוד למסלול שנוצר בין‬
‫הקדקודים הקודמים‪.‬‬
‫הדרך היעילה ביותר להוסיף קדקוד למסלול היא באמצעות חפוש בינארי‪ :‬אם מתקיים ‪v1vnvn-1‬‬
‫אז נבדוק אם להמשיך בחפוש בחצי המסלול הימני או בחצי המסלול השמאלי‪ ,‬על ידי בדיקת כוון הקשת‬
‫בין ‪ vn‬לקודקוד האמצע במסלול‪.‬‬
‫אבל להוסיף אח"כ את הקדקוד למקומו במערך‪.O(V2) :‬‬
‫סבוכיות האלגוריתם על כן‪. O(V2 + VlogV) = O(V2) :‬‬

‫(הערה‪ :‬אם מממשים על ידי רשימה מקושרת ‪ ,‬אז זמן חיפוש איבר הוא )‪ O(V‬וזמן צירופו למקומו‬
‫)‪O(1‬‬
‫ולכן סה"כ )‪ O(V2‬כמו במערך ) ‪.‬‬

‫‪14‬‬

You might also like