Vous êtes sur la page 1sur 30

‫תכנון וניתוח אלגוריתמים – סיכום התרגולים‬

‫תרגול ‪1‬‬
‫‪2.3.04‬‬

‫סיבוכיות‬

‫‪O (g (n))   f (n ) | c  0 ,n 0  0 ‬‬


‫‪| n  n 0 0  f (n ) c g (n )‬‬
‫‪ (g (n))   f (n ) | c  0 ,n 0  0 ‬‬
‫‪| n  n 0 0  c g (n ) f (n )‬‬
‫‪ (g (n))   f (n ) | c 1  0 , c 2  0 ,n 0  0 ‬‬
‫‪| n  n 0 0  c 1 g (n ) f (n ) c 2 g (n )‬‬

‫‪‬היא חסם תחתון לסיבוכיות של בעיה‪.‬‬


‫‪‬היא חסם הדוק‪.‬‬

‫‪g (n )  ( f (n))‬‬ ‫))‪f (n ) O (g (n‬‬

‫‪‬‬ ‫‪O‬‬
‫) ‪f (n‬‬ ‫))‪(g (n‬‬
‫‪‬‬
‫) ‪f (n‬‬ ‫‪ (g (n))‬‬ ‫‪‬‬
‫‪‬‬ ‫‪‬‬
‫) ‪f (n‬‬ ‫))‪(g (n‬‬

‫‪gol‬‬ ‫‪‬‬
‫‪n(gol‬‬ ‫‪n 2  n )(gol‬‬
‫‪‬‬ ‫‪2 n 2 )‬‬
‫‪gol‬‬ ‫‪n 2  1  gol‬‬
‫‪2‬‬ ‫‪n1‬‬
‫‪‬‬
‫‪(gol‬‬ ‫‪‬‬
‫(‪n 2  n )gol‬‬ ‫)‪n‬‬

‫‪(gol:‬‬ ‫‪n !)   (gol‬‬


‫‪n‬‬ ‫נוכיח ש ) ‪n‬‬
‫‪n‬‬ ‫‪n‬‬ ‫‪n‬‬
‫‪gol‬‬ ‫‪‬‬
‫‪gol‬‬ ‫‪‬‬
‫‪n(gol‬‬ ‫‪n  1 )... gol‬‬
‫‪‬‬ ‫‪‬‬ ‫‪‬‬
‫‪gol n(gol‬‬ ‫‪n  1 )... gol‬‬
‫‪‬‬ ‫‪‬‬
‫‪2(gol‬‬ ‫‪n !)‬‬
‫‪gol‬‬ ‫‪n n  gol‬‬
‫‪n‬‬ ‫‪n‬‬
‫‪2‬‬ ‫‪2‬‬ ‫‪2‬‬
‫‪3‬‬
‫‪‬‬
‫‪n gol‬‬ ‫‪5‬‬
‫) ‪n   (3 n‬‬
‫בחזקה קבועה כלשהי‪ .‬ניתן לראות זאת ע"י שימוש‬
‫‪gol‬‬ ‫‪n‬בחזקה קבועה כלשהי תמיד יותר גדול מ‬
‫בכלל לופיטל (כש ‪n‬שואף לאינסוף)‪.‬‬

‫‪gol‬‬
‫(אין השפעה לבסיס)‬ ‫‪2‬‬ ‫‪‬‬
‫(‪n gol‬‬ ‫‪3‬‬ ‫)‪n‬‬

‫‪gol‬‬ ‫(‪n 2 gol‬‬


‫‪o‬‬ ‫‪2‬‬
‫)‪n‬‬

‫‪n‬‬
‫) ‪ o (n‬‬
‫‪gol‬‬ ‫‪n‬‬

‫‪gol gol‬‬ ‫‪n  o (gol‬‬ ‫)‪n‬‬

‫תכנון דינמי‬

‫כיצד נזהה שניתן לפתור בעיה באמצעות תכנון דינמי?‬


‫תתי בעיות חופפות‪.‬‬ ‫‪-‬‬
‫תת מבנה אופטימלי‪ .‬הפתרון האופטימלי של הבעיה צריך להיות מורכב מהפתרון האופטימלי של‬ ‫‪-‬‬
‫הבעיות הקודמות‪.‬‬

‫תרגיל‬
‫‪1‬‬ ‫לאורך נהר יש ‪n‬תחנות‪ .‬בכל תחנה‬
‫‪ i,...,‬ניתן לשכור סירה ואפשר להחזירה בכל תחנה‬ ‫‪n‬‬
‫‪. j i,...,‬‬
‫‪1‬‬ ‫‪n‬‬
‫אי אפשר לשוט נגד הזרם‪.‬‬
‫‪Anxn‬כך שהאיבר ‪ ji‬מייצג את מחיר השכרת סירה בתחנה ‪i‬‬
‫‪a‬‬ ‫מחירי ההשכרות נתונים במטריצה‬
‫והחזרתה ב ‪. j‬‬
‫אין תשלום נוסף על החלפות‪.‬‬
‫מצא את סדרת ההחלפות שתאפשר שייט במחיר מינימלי מתחנה ‪ 1‬לתחנה ‪n.‬‬

‫תתי הבעיות הכלליות – כיצד מגיעים בצורה האופטימלית לתחנה ‪.i‬‬ ‫‪-‬‬
‫תתי בעיות בסיסיות – הבעיות שמתחילים מהן‪.‬‬ ‫‪-‬‬
‫סדר הפתרון‪.‬‬ ‫‪-‬‬
‫פתרון תת בעיה כללית‪.‬‬ ‫‪-‬‬
‫פתרון השאלה כולה‪.‬‬ ‫‪-‬‬

‫אלגוריתם‬
‫‪M‬‬‫‪ .i‬נסמן אותו ב ]‪. [i‬‬ ‫‪i‬‬
‫נחפש לכל תחנה את המחיר המינימלי הדרוש להגיע מתחנה ‪ 1‬עד‬
‫נתחיל מתחנה ‪ .1‬נסמן ‪M [1 ] 0‬‬
‫ונמשיך לפי סדר התחנות‪.‬‬
‫פתרון תת בעיה מסדר ‪i‬יהיה‪:‬‬
‫‪‬‬
‫‪M [ i]nim‬‬ ‫‪ [ j] a ij ‬‬
‫‪M‬‬
‫‪1 j i1‬‬
‫‪M‬‬‫לאחר פתרון כל תתי הבעיות‪ ,‬פתרון השאלה יהיה ] ‪. [n‬‬

‫סיבוכיות‪:‬‬
‫‪n‬תתי בעיות‪ .‬כל בעיה נפתרת בסיבוכיות לכל היותר של ) ‪O. (n‬לכן סה"כ סיבוכיות ) ‪O. (n 2‬‬ ‫יש‬

‫הוכחה‪:‬‬
‫הוכחה באינדוקציה על סדר הפתרון‪.‬‬
‫בדיקה – המסלול האופטימלי מתחנה ‪ 1‬לעצמה יהיה במחיר ‪( 0‬נשארים במקום)‪.‬‬ ‫‪.i‬‬
‫‪k.‬‬ ‫הוא המחיר המינימלי להגיע מתחנה ‪ 1‬לתחנה‬ ‫‪M‬‬ ‫‪[k‬‬ ‫]‬ ‫הנחה – לכל ‪1,  k  i 1‬‬ ‫‪.ii‬‬
‫‪M‬‬‫‪: [TPO‬‬‫‪i]‬‬ ‫נוכיח ש ]‪[ i‬‬ ‫‪.iii‬‬
‫סדרת ההחלפות שנותנת מחיר מינימלי מתחנה ‪ 1‬לתחנה ‪.i‬‬ ‫‪TPO‬‬ ‫‪-‬‬ ‫נסמן ]‪[i‬‬
‫‪TPO‬את הסירה האחרונה לפני ‪.i‬‬ ‫לקח‬ ‫נסמן ‪ - j‬התחנה שבה ]‪[i‬‬
‫‪j‬‬ ‫‪TPO‬‬
‫עד תחנה ‪.‬‬ ‫‪[i‬‬ ‫]‬ ‫המסלול של‬‫‪TPO‬‬ ‫‪-‬‬ ‫]‪j[i‬‬ ‫נסמן‬
‫‪TPO‬‬ ‫‪i]‬‬
‫‪[TPO‬‬ ‫‪j[ i] a ij M [ j] a ij nim‬‬
‫‪‬‬ ‫‪M‬‬‫]‪ [r ] a ir M [ i‬‬
‫‪1 r i1‬‬

‫הנחת האינדוקציה על ‪j‬‬

‫‪ – DAG‬גרף מכוון ללא מעגלים (גמ"ל)‬

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

‫‪y‬‬ ‫‪x‬‬
‫‪v,u,x,y‬‬
‫‪u,v,x,y‬‬

‫תרגול ‪2‬‬
‫‪9.3.04‬‬

‫תרגיל‬
‫נתון עץ ‪ .T‬מצא כמה קבוצות בלתי תלויות של קודקודים יש ב ‪.T‬‬
‫קבוצה בלתי תלויה של קודקודים היא קבוצה של קודקודים כך שלאף אחד מהקודקודים בקבוצה אין‬
‫קשר לאחרים‪.‬‬

‫קבוצות של קודקודים בודדים‪:‬‬


‫‪v6‬‬ ‫‪v5 , v4 , v3 , v2 , v 1  ,‬‬ ‫‪    ‬‬
‫זוגות וכו'‪:‬‬
‫‪v2v 1 , ‬‬
‫אלגוריתם‪:‬‬
‫נחפש לכל קודקוד ‪v‬את מס' תתי הקבוצות הבלתי תלויות בתת העץ שהוא מגדיר ‪T. v‬‬
‫נתחיל מהעלים‪ .‬בתת עץ של עלה יש שתי קבוצות בלתי תלויות של קודקודים‪.‬‬
‫סדר הפתרון יכול להיות כל סדר שמבטיח שבזמן הפתרון של ‪v‬כל תתי הבעיות שמתאימות לקודקודי‬
‫‪T v‬יהיו פתורות‪ .‬לדוגמא‪ :‬סדר לפי רמות‪.‬‬

‫[ ]‪v -N‬מספר הקבוצות הבלתי תלויות ב ‪T. v‬‬ ‫נסמן‬


‫מס' הקבוצות שכוללות את ‪ +v‬מס' הקבוצות שלא כוללות את ‪v N] [  v‬‬
‫[ ]‪u N‬‬ ‫‪u N] [ ‬‬ ‫‪v N] [  ‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬
‫‪v fo nosdnarg u‬‬ ‫‪v fo nos u‬‬

‫[‪]toor‬‬
‫‪N.‬‬ ‫פתרון הבעיה כולה הוא‬

‫‪v ]N [ 3 v ]N [ v2 ‬‬
‫[ ‪]N‬‬ ‫‪1‬‬ ‫[ ‪v ]N‬‬ ‫‪0‬‬ ‫‪‬‬
‫[ ‪ [ 4 v]N [ 3 v ]N‬‬
‫‪v ]N [ 6v ]N [ 5v ]N‬‬ ‫‪1‬‬ ‫‪‬‬

‫סיבוכיות‪:‬‬
‫כל קודקוד נכנס לחישוב ‪ 3‬פעמים‪ :‬בחישוב שלו‪ ,‬בחישוב של אבא שלו ובחישוב של סבא שלו‪ .‬לכן‬
‫( ‪n O).‬‬ ‫הסיבוכיות היא‬

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

‫בסיס האינדוקציה‪:‬‬
‫מס' הקבוצות הבלתי תלויות בתת עץ של עלה הוא ‪ :2‬העלה עצמו והקבוצה הריקה‪.‬‬

‫הנחה‪:‬‬
‫[ ‪u N].‬‬ ‫‪u‬מס'‪T‬הקבוצות הבלתי תלויות ב ‪T u‬הוא‬ ‫‪v‬‬ ‫לכל קודקוד‬

‫הוכחה‪:‬‬
‫מס' הקבוצות הבלתי תלויות ב ‪T v‬הוא מס' הקבוצות הבלתי תלויות ב ‪T v‬שכוללות את ‪v‬ועוד מספר‬
‫הקבוצות שלא כוללות את ‪v.‬‬
‫מס' הקבוצות שלא כוללות את ‪v‬שווה למספר האפשרויות לאחד קבוצות בלתי תלויות מתתי העצים של‬
‫הבנים ולכן שווה למכפלה הקרטזית של מס' הקבוצות בכל בן‪ .‬לפי הנחת האינדוקציה מס' הקבוצות בכל‬
‫‪‬‬
‫‪.‬‬ ‫‪uN‬‬‫לכן מס' הקבוצות מסוג זה הוא ‪] [ ‬‬
‫[ ‪u N].‬‬ ‫‪u‬שהוא בן של ‪v‬הוא‬
‫‪v fonos u‬‬

‫שאלה‬
‫נתונות ‪ 3‬מחרוזות‪.‬‬
‫‪ X‬באורך ‪.n‬‬
‫‪ Y‬באורך ‪.m‬‬
‫‪ Z‬באורך ‪.n+m‬‬
‫תאר אלגוריתם הקובע האם ‪ Z‬הוא מיזוג של ‪ X‬ו ‪.Y‬‬

‫דוגמא למיזוג‪:‬‬
‫‪x‬‬ ‫‪,...,‬‬
‫‪x2 x 1 ,‬‬ ‫‪n‬‬

‫‪y‬‬ ‫‪,...,‬‬
‫‪y2 y 1 ,‬‬ ‫‪n‬‬

‫‪y y x x3 x2 , y5 , x4 , x3 , 1Z, 2 , 1 ,‬‬

‫‪X.‬‬ ‫‪j‬‬ ‫‪Y‬ו‬ ‫‪i‬‬ ‫‪jz i‬היא מיזוג של‬ ‫בתא‪j in, ‬‬
‫נרשום '‪ '1‬אם‬ ‫‪ 1 ‬‬
‫‪1 .m‬‬ ‫‪‬‬ ‫‪‬‬ ‫נבנה מטריצה בגודל‬

‫‪Xj‬‬ ‫\‪Yi‬‬ ‫‪0 1 2‬‬ ‫‪n‬‬


‫‪0‬‬
‫‪1‬‬
‫‪2‬‬

‫‪m‬‬

‫‪)0, .(i‬‬ ‫תתי הבעיות יהיו השורה ‪) ,0( j‬‬


‫והעמודה‬
‫נפתור את תתי הבעיות הבסיסיות ע"י השוואה של ‪ X‬ל ‪ Z‬ו ‪ Y‬ל ‪.Z‬‬
‫סדר הפתרון יהיה לפי סדר השורות‪ .‬הפתרון יהיה בתא הימני מלמטה‪.‬‬

‫‪] [ j X] j [ i Z1 fi ‬‬


‫‪, [j i A dna‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬
‫‪j ]i A, [  ‬‬
‫‪esle‬‬
‫‪0‬‬

‫תרגול ‪3‬‬
‫‪16.3.04‬‬

‫קשתות שקיימות ב ‪ BFS‬בגרף לא מכוון – קשתות עץ‪ ,‬קשתות חוצות‪.‬‬

‫הוכח או הפרך‬
‫‪u‬‬ ‫‪v‬‬ ‫‪v‬‬ ‫‪u‬‬ ‫‪v‬‬ ‫‪u‬‬
‫אם יש מסלול מכוון מ ל בגרף מכוון ‪ G‬וב ‪ DFS‬מתגלה לפני ‪ ,‬אזי צאצא של בעץ‬
‫הסריקה‪.‬‬

‫דוגמא נגדית‪:‬‬
‫‪s‬‬

‫‪u‬‬ ‫‪v‬‬

‫‪2 V, 1 ,‬כך‪V‬שכל הקשתות הן בין‬ ‫גרף נקרא דו צדדי אם אפשר לחלק את הקודקודים שלו לשתי קבוצות‬
‫הקבוצות‪.‬‬

‫תרגיל‬
‫אלגוריתם הקובע האם הוא דו צדדי ואם כן מוצא חלוקה‬ ‫‪) ‬‬
‫‪G‬תאר ‪E V‬‬ ‫( ‪,‬‬ ‫בהינתן גרף לא מכוון‬
‫מתאימה של הקודקודים‪.‬‬

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

‫הוכחה‪:‬‬

‫כיוון ‪:1‬‬
‫אינדוקציה‪:‬‬
‫נניח שהגרף דו צדדי‪.‬‬
‫הקודקודים ברמה ‪ i‬הם שכנים של הקודקודים ברמה ‪ .i 1‬לפי הנחת האינדוקציה כל הקודקודים ב‬
‫‪ i 1‬הם באותה קבוצה‪ .‬נניח בלי הגבלת הכלליות לגבי ‪V. 1‬לכן כל הקודקודים ברמה ‪ i‬חייבים להיות ב‬
‫‪V 2‬ולכן לא יכולה להיות קשת בין שני קודקודים ברמה ‪.i‬‬

‫משפט‪ :‬גרף הוא דו צדדי אם ורק אם אין בו מעגלים באורך אי זוגי‪.‬‬

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

‫‪E ) V O. ( ‬‬ ‫סיבוכיות‪:‬‬

‫תרגיל‬
‫‪x‬‬ ‫‪,...,‬‬
‫‪x2 .x 1 ,‬‬ ‫‪x i‬על ‪n x j‬משתנים ‪n‬‬ ‫נתונה מערכת של ‪m‬אי שוויונים מהצורה‬
‫השמה מספקת היא קביעת ערך למשתנים כך שכל אי השוויונים מתקיימים‪.‬‬
‫תאר אלגוריתם הבודק אם יש השמה מספקת ואם כן מוצא כזאת‪.‬‬

‫אלגוריתם‪:‬‬
‫נבנה‪ x‬קשת מכוונת‬
‫‪j‬‬ ‫‪x i‬‬ ‫נבנה גרף מכוון כך שהקודקודים יהיו המשתנים ועבור כל אי שוויון‬
‫‪x j .x‬‬ ‫‪i‬‬

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

‫הוכחה‪:‬‬

‫כיוון ראשון‪:‬‬
‫‪v1‬‬ ‫‪v‬‬‫‪ v‬‬ ‫‪2‬‬ ‫‪v‬‬‫‪‬‬
‫‪.1‬‬ ‫‪...‬‬ ‫‪i‬‬ ‫נניח שיש מעגל בגרף‪ .‬נסמן אותו ב‬
‫וגם‪v v. i  1v2‬‬
‫אין‪v‬שני מספרים שיכולים לקיים את התנאים על‬ ‫‪ v 1‬‬ ‫‪...‬‬ ‫לכן לפי בניית הגרף ‪i‬‬

‫‪v v1 , i‬‬
‫ולכן אין השמה מספקת‪.‬‬

‫כיוון שני‪:‬‬
‫נניח שאין בגרף מעגלים‪ .‬כלומר הגרף הוא ‪ .DAG‬לכן ניתן למיין אותו טופולוגית‪ .‬ניתן ערכים למשתנים‬
‫לפי המיקום שלהם במיון הטופולוגי‪.‬‬
‫‪ .x‬לכן ‪x ix j‬יופיע לפני ‪ x j‬במיון ולכן יקבל ערך קטן‬
‫‪i‬‬ ‫‪ x i‬אי ‪x j‬‬
‫שוויון מהנתון‪ .‬אזי יש קשת‬ ‫יהי‬
‫מ ‪.x j‬‬

‫סיבוכיות‪:‬‬
‫‪n )m O. ( ‬‬ ‫בניית הגרף‪:‬‬
‫‪n )m O. ( ‬‬ ‫בדיקת מעגלים‪:‬‬
‫‪n )m O. ( ‬‬ ‫מיון טופולוגי‪:‬‬
‫‪n )m O. ( ‬‬ ‫סה"כ‪:‬‬

‫תרגול ‪4‬‬
‫‪23.3.04‬‬

‫תרגיל‬
‫עוצמה של קודקוד‪:‬‬ ‫‪V w. : ‬‬
‫נגדיר ‪R‬‬ ‫יהיה ‪ G‬גרף מכוון עם משקלים על הקודקודים‬
‫‪vw‬‬ ‫‪) ( ‬‬
‫‪) ( {xam u P‬‬ ‫{יש מסלול מכוון מ ‪u‬ל ‪|v‬‬
‫‪V v‬‬

‫מצא את עוצמת כל קודקודי ‪.G‬‬

‫אלגוריתם‪:‬‬
‫נניח שהגרף הוא ‪ .DAG‬נמיין את הגרף טופולוגית ונמצא לכל קודקוד את העוצמה שלו‪.‬‬
‫נתחיל מהקודקוד האחרון במיון‪ ,‬כאשר העוצמה שלו תהיה שווה למשקל שלו‪ .‬נמשיך מהסוף להתחלה‪.‬‬
‫‪E‬‬ ‫‪v u) e, (‬‬
‫‪v |P‬‬
‫‪) ( u ,)w ( xam u P‬‬‫‪). ( ‬‬ ‫‪‬‬ ‫‪‬‬ ‫עבור קודקוד ‪u‬נקבע‪  :‬‬

‫סיבוכיות‪:‬‬
‫‪E ) V O. ( ‬‬ ‫מיון טופולוגי‪:‬‬
‫‪E ) V O. ( ‬‬ ‫מספר הבדיקות בתכנון הדינמי יהיה כמספר הקשתות‪ .‬לכן סיבוכיות התכנון הדינמי תהיה‬
‫‪E ) V O. ( ‬‬ ‫סה"כ‪:‬‬

‫הוכחה באינדוקציה על סדר הפתרון‪:‬‬

‫בסיס‪ :‬עבור הקודקוד האחרון‪.‬‬


‫לא יוצאת ממנו אף קשת‪ .‬לכן הקודקוד היחיד שניתן להגיע אליו הוא הקודקוד עצמו ולכן העוצמה שלו‬
‫היא המשקל שלו‪..‬‬

‫הנחה‪:‬‬
‫‪(‬‬
‫‪z |P‬‬
‫( ‪) ( v ,)w‬‬ ‫‪). ( ‬‬
‫‪xam v P‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫לכל קודקוד ‪v‬שאחרי ‪u‬במיון‪ ,‬העוצמה של ‪v‬היא‬

‫הוכחה‪:‬‬
‫שקיים ‪u‬שכן של ‪v‬וקיים‬
‫‪v /‬או ‪v‬‬ ‫‪v‬‬
‫אם ‪v /‬הוא הקודקוד הכבד ביותר שניתן להגיע אליו מ ‪ ,‬אז‬
‫‪v )w ( v P‬‬ ‫‪). ( ‬‬ ‫‪/‬‬
‫מסלול מ ‪u‬ל ‪ v. /‬לכן‬
‫שתי‪ v‬אפשרויות‪:‬‬
‫יש ‪)w‬‬
‫אז (‬‫‪vP‬‬ ‫‪), ( ‬‬ ‫‪/‬‬
‫אם נניח בשלילה ש‬
‫‪( v w). ( ‬‬
‫סתירה‪v )w.‬‬ ‫‪/‬‬
‫א‪.‬‬
‫הנחת האינדוקציה קיים מסלול מ ‪u‬לקודקוד ‪z‬‬
‫לפי‪v )w‬‬
‫ואז (‬
‫‪uP‬‬‫‪) ( ‬‬ ‫‪/‬‬
‫ב‪ .‬קיים ‪ u,‬שכן של ‪ v,‬כך ש‬
‫מסלול גם מ ‪v‬ל ‪ .z‬סתירה‪.‬‬
‫קיים‪v )w‬‬
‫ואז (‬‫‪) ( ‬‬
‫‪z w‬‬ ‫‪/‬‬
‫כך ש‬

‫אם הגרף מכיל מעגלים – אלגוריתם‪:‬‬


‫נבנה גרף ‪G /‬המתקבל מ ‪ G‬ע"י כיווץ הרכיבים הקשירים היטב לקודקודים‪.‬‬
‫משקל כל קודקוד כזה יהיה משקל הקודקוד המקסימלי ברכיב‪.‬‬
‫על הגרף שקיבלנו ‪(G /‬שהוא ‪ )DAG‬נריץ את האלגוריתם הקודם‪.‬‬
‫עוצמת כל קודקוד ב ‪ G‬תהיה העוצמה של הקודקוד המתאים לו ב ‪G. /‬‬

‫לדוגמא‪:‬‬

‫‪E ) V O. ( ‬‬ ‫סיבוכיות‪:‬‬

‫הוכחה‪:‬‬
‫מסלול מ ‪v‬ל ‪u.‬‬ ‫‪u v,‬‬
‫וקיים ‪G‬‬
‫‪G,‬חלק מהקשתות בו יתכווצו ונקבל מסלול מהקודקוד המתאים ל ‪v‬‬ ‫‪/‬‬
‫לכן אם ניקח את אותו מסלול ב‬
‫לקודקוד המתאים ל ‪u‬ב ‪G. /‬‬
‫קודקודים ב ‪ G‬כך ש ‪v /‬מתאים ל ‪u / v,‬מתאים‬ ‫אם יש מסלול מקודקוד ‪v /‬לקודקוד ‪u /‬ב ‪u v , G, /‬‬
‫ל ‪ u.‬כל קודקוד במסלול ב ‪G /‬ניתן לפתיחה למסלול ב ‪ ,G‬כיוון שהקודקוד מייצג רכיב קשיר היטב‪.‬‬
‫לכן נקבל מסלול ב ‪.G‬‬

‫תרגיל‬
‫יהי ‪ G‬גרף לא מכוון ו ‪ s‬קודקוד ב ‪ .G‬מצא את המעגל הפשוט הקצר ביותר המכיל את ‪.s‬‬

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

‫‪s‬‬

‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫הערה‪ :‬המעגלים שנמצא לא יהיו כל המעגלים המכילים את ‪ ,s‬אך המעגל המינימלי יהיה אחד מאלה‪.‬‬
‫זאת משום שיכול להיות מעגל שיש בו כמה קשתות חוצות‪ .‬מעגל מסוג זה לא יהיה לעולם מינימלי‪.‬‬

‫תרגול ‪5‬‬
‫‪30.3.04‬‬

‫(המשך התרגיל מהשבוע שעבר)‬

‫‪s‬‬

‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫המעגל המינימלי הוא הסכום הקטן ביותר של שתי הרמות של תתי העצים ושל הקשת החוצה‪.‬‬
‫אלגוריתם‪:‬‬
‫נריץ ‪ BFS‬מ ‪ s‬ונזכור לכל קודקוד את הרמה שלו בסריקה ואת הקודקוד השני במסלול מ ‪ s‬אליו בסריקה‬
‫(השורש של תת עץ שהוא בן של ‪ .)s‬נעבור על כל הקשתות החוצות המחברות קודקודים מתתי עצים‬
‫שונים‪ .‬לכל קשת כזו גודל המעגל שהיא סוגרת יהיה סכום הרמות של הקודקודים שלה ועוד אחד‪ .‬נמצא‬
‫את הקשת הנותנת סכום מינימלי‪.‬‬

‫הוכחה‪:‬‬
‫( ‪v),u ,e,‬‬
‫ממסלול מ ‪ s‬ל ‪ u‬וממסלול מ ‪ s‬ל ‪ .v‬בגלל ש ‪ v,u‬נמצאים‬ ‫המעגל שקיבלנו מורכב מהקשת‬
‫בתתי עצים שונים של בנים של ‪ ,s‬המסלולים הנ"ל זרים ולכן המעגל פשוט ומכיל את ‪.s‬‬
‫ניקח מעגל פשוט כלשהו המכיל את ‪ .s‬המעגל מכיל לפחות קשת אחת חוצה בין שני תתי עצים שונים‪.‬‬
‫( ‪v )u ,e.‬‬ ‫נסמן קשת זו כ‬
‫( ‪v )u ,e.‬‬
‫מכיוון ש ‪ BFS‬מוצא‬ ‫המעגל מורכב ממסלול מ ‪ s‬ל ‪ ,u‬מסלול מ ‪ s‬ל ‪( v‬המסלולים זרים) והקשת‬
‫( ‪v )u ,e‬‬ ‫את המסלולים הקצרים ביותר‪ ,‬המעגל המתקבל מהמסלולים בעץ מ ‪ s‬ל ‪ u‬ומ ‪ s‬ל ‪ v‬עם הקשת‬
‫הוא באורך קטן או שווה למעגל שבחרנו והוא פשוט ומכיל את ‪.s‬‬
‫לכן המעגל המינימלי הפשוט המכיל את ‪ s‬מכיל בדיוק קשת אחת חוצה‪.‬‬

‫סיבוכיות‪:‬‬
‫‪E ) V O. ( ‬‬ ‫‪:BFS‬‬
‫‪E O‬‬
‫( ‪).‬‬ ‫(‪O)1‬פעולות‪.‬‬ ‫בדיקה‪ :‬מעבר על כל הקשתות‪ ,‬כל קשת ב‬
‫‪E ) V O. ( ‬‬ ‫סה"כ‪:‬‬

‫‪ E‬עם שתי תתי קבוצות של קודקודים ‪B A. ,‬‬ ‫מכוון‬ ‫‪) ‬‬


‫‪G‬גרף ‪V‬‬ ‫( ‪,‬‬ ‫יהיה‬
‫‪V 2 (V 1 ,‬‬ ‫נגיד כי ‪ A‬ניתנת להפרדה מ ‪ B‬אם אפשר לחלק את קודקודי הגרף לשתי קבוצות‬
‫‪V 2‬יש אותו כיוון‪.‬‬ ‫ולכל‪A  V‬‬
‫הקשתות ‪V‬בין ‪V 1‬ל‬ ‫ש‪1 B  V 22 , V 1V ‬‬
‫‪ V) 1  ,‬כך‪V 2‬‬
‫בהנתן גרף וקבוצות כנ"ל קבע האם ‪ A‬ניתנת להפרדה מ ‪.B‬‬

‫‪A‬‬ ‫‪B‬‬

‫אלגוריתם‪:‬‬
‫‪b‬‬
‫ונבדוק האם קיימים מסלולים מ ‪ a‬ל ‪ b‬ומ ‪ b‬ל ‪( a‬למשל ע"י‬‫‪a‬‬ ‫‪,‬‬ ‫‪B‬‬
‫לקודקודים‬‫‪A‬‬ ‫‪,‬‬ ‫נכווץ את הקבוצות‬
‫‪ .)BFS‬אם קיימים שני המסלולים‪ ,‬אז אין חלוקה כזו‪ .‬אחרת יש חלוקה‪.‬‬

‫הוכחה‪:‬‬
‫‪‬‬
‫נניח שיש שני מסלולים‪ :‬מסלול מ ‪ a‬ל ‪ b‬ומסלול מ ‪ b‬ל ‪ .a‬כל חלוקה המפרידה בין ‪ a‬ל ‪ b‬חותכת את שני‬
‫המסלולים ולכן מכילה קשתות בכיוונים מנוגדים‪ .‬לכן אין חלוקה‪.‬‬
‫‪a‬‬ ‫‪b‬‬

‫‪‬‬
‫נניח שאין את שני המסלולים ונניח בלי הגבלת הכלליות שאין מסלול מ ‪ B‬ל ‪.A‬‬
‫נסמן ב ‪V 2‬את כל הקודקודים הניתנים להגעה מ ‪ .B‬מכיוון שאין מסלול מ ‪ B‬ל ‪ ,A‬אז ‪ 2‬לא כולל‬
‫‪V‬‬
‫‪V B V 2 A.  1‬‬ ‫קודקודים מ ‪A‬‬
‫‪V u‬‬
‫מסלול מ ‪ B‬ל ‪ u‬ולכן יש מסלול מ ‪ B‬ל ‪ .v‬סתירה‪.‬‬ ‫אזי‪V‬יש‬
‫‪2 v‬‬‫‪, 1‬‬ ‫כך )ש‬
‫‪,v (u‬‬ ‫נניח שיש קשת‬

‫סיבוכיות‪:‬‬
‫‪E ) V O. ( ‬‬ ‫שתי סריקות ‪:BFS‬‬

‫אלגוריתם המוצא קבוצת קודקודים ‪ U‬בעלת גודל קטן ביותר‪ ,‬כך‬ ‫‪). ‬‬
‫‪G‬תאר‪E V‬‬ ‫( ‪,‬‬ ‫נתון גרף מכוון‬
‫‪U u‬‬
‫עבורו יש מסלול מכוון מ ‪ u‬ל ‪.v‬‬ ‫‪U‬‬ ‫‪V‬‬‫‪‬‬‫)‬
‫קיים‬‫‪v‬‬‫‪‬‬ ‫(‬ ‫שלכל‬

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

‫תרגול ‪6‬‬
‫‪13.4.04‬‬

‫(המשך האלגוריתם מהתרגול הקודם)‬

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

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

‫תהי ‪U /‬קבוצה חוקית‪ .‬לרכיב ‪u‬בגרף החדש יש דרגת כניסה ‪ .0‬לכן עבור קודקוד בתוך הרכיב אפשר‬
‫להגיע אליו רק מהקודקודים האחרים ברכיב‪ .‬משום כך ‪U /‬מכילה לפחות קודקוד אחד מהרכיב בעל‬
‫דרגה ‪ 0‬ולכן הקבוצה שבחרנו מינימלית‪.‬‬
‫מסלולים קלים ביותר‬
‫‪t .s ,‬‬ ‫משקלים אי שליליים על הקשתות ונתונים קודקודים‬ ‫‪) ‬‬
‫‪G‬עם ‪E V‬‬ ‫( ‪,‬‬ ‫נתון גרף‬
‫אנו מחפשים את המשקל הקל ביותר (סכום הקשתות במסלול) מ ‪ s‬ל ‪t.‬‬

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

‫מתחילים בקודקוד ‪ s‬כמועמד עם מרחק זמני ‪.0‬‬


‫שלב ב'‪ :‬איטרציה – מוצאים את הקודקוד ‪v‬בעל המרחק הזמני הקטן ביותר מבין המועמדים‪ ,‬הופכים את‬
‫המרחק הזמני לקבוע (מעבירים את ‪v‬לפתורים)‪.‬‬
‫‪,] [ nim‬‬
‫‪v )w , (v M] [u M‬‬ ‫‪u M.] [ ‬‬ ‫‪‬‬ ‫עבור כל ‪u‬שכן של ‪v‬נעדכן את המרחק הזמני ‪‬‬
‫תת הבעיה הכללית היא מציאת המרחק המינימלי מ ‪ s‬לכל קודקוד‪ .‬נמצא את הפתרון באמצעות תכנון‬
‫דינמי‪.‬‬

‫‪1‬‬
‫‪8‬‬ ‫‪9‬‬

‫‪10‬‬
‫‪s‬‬
‫‪0‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪9‬‬
‫‪4‬‬ ‫‪6‬‬
‫‪5‬‬
‫‪7‬‬
‫‪5‬‬ ‫‪7‬‬
‫‪2‬‬
‫סיבוכיות‪:‬‬
‫על מבנה הנתונים לבצע את הפעולות הבאות‪:‬‬
‫הוצאת מינימום‪.‬‬ ‫‪-‬‬
‫‪ -‬עדכון‪.‬‬
‫הכנסה‪.‬‬ ‫‪-‬‬
‫)‪V‬‬ ‫‪gol‬‬
‫( ‪E O.‬‬ ‫בשימוש בערימה הסיבוכיות הכללית היא‬

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

‫תרגיל‪:‬‬
‫‪v‬‬ ‫)‬‫‪u‬‬
‫בעלת‬ ‫‪,‬‬‫‪e‬‬ ‫(‬ ‫‪E‬‬ ‫‪V‬‬
‫גרף מכוון עם משקלים אי שליליים על הקשתות‪ ,‬פרט לקשת אחת‬ ‫‪G‬‬
‫)‬ ‫‪‬‬
‫‪,‬‬ ‫(‬ ‫יהי‬
‫משקל שלילי ונתון קודקוד ‪ .s‬מצא את המרחק מ ‪ s‬ליתר הקודקודים בגרף‪ .‬נניח שאין מעגלים בעלי‬
‫משקל שלילי‪.‬‬
‫‪5-‬‬

‫‪2‬‬
‫‪s‬‬
‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫אלגוריתם‪:‬‬
‫נוריד את הקשת ‪e‬ונמצא את המרחק מ ‪ s‬לכל הקודקודים במסלולים שלא משתמשים ב ‪e‬ע"י‬
‫דייקסטרה מ ‪ .s‬נסמן ב ‪d /‬את המרחקים‪.‬‬
‫נמצא את המרחק מ ‪v‬לכל יתר הקודקודים ע"י דייקסטרה מ ‪v.‬‬
‫‪v‬‬ ‫(‪( e w ) ( u )d s(x ,)d s‬‬ ‫‪/‬‬
‫‪nim‬‬‫‪x d.) s ( ‬‬ ‫‪/‬‬ ‫‪/‬‬
‫‪‬‬ ‫‪‬‬
‫לכל קודקוד ‪x‬נחשב את המרחק‪:‬‬
‫תרגול ‪7‬‬
‫‪20.4.04‬‬

‫סיבוכיות‪:‬‬
‫)‪V‬‬ ‫‪gol‬‬
‫( ‪E O‬‬

‫הוכחה‪:‬‬
‫ברור שהמסלול שמצאנו הוא מסלול חוקי‪ .‬אפשר להניח שהמסלול הקל ביותר מ ‪ s‬לקודקוד כלשהו ‪x‬‬
‫הוא פשוט‪.‬‬
‫יהי ‪ P‬המסלול הקל ביותר מ ‪ s‬ל ‪(x‬אנו מניחים כי ‪ P‬הוא מסלול פשוט – הוא לא יכול להיות מעגל‬
‫משום שמשקלו הוא אי שלילי)‪.‬‬
‫אם ‪ P‬לא עובר דרך ‪ e,‬אז ‪ P‬קיים גם בגרף ללא הקשת השלילית ולכן ‪p )w (  s‬‬
‫מכיוון ‪d‬‬
‫שדייקסטרה‬
‫( ‪)d (v x ,)d‬‬ ‫( ‪nimxs )d ( sp )w.‬‬ ‫‪‬‬ ‫‪s‬‬ ‫‪‬‬ ‫‪/‬‬
‫‪‬‬ ‫מוצא את המסלול המינימלי‪ .‬לכן‬
‫‪eP‬מסלול‪P‬מ ‪ s‬ל ‪(u‬מסלול פשוט לא‬ ‫‪2P‬‬
‫ש ‪1‬‬ ‫‪ P, ‬כך‬ ‫‪1‬‬ ‫אם ‪ P‬עובר דרך הקשת השלילית‪ ,‬אז‬
‫דרך ‪.)e‬‬
‫‪P 2‬מסלול פשוט לא דרך ‪e‬מ ‪v‬ל ‪.x‬‬
‫מנכונות דייקסטרה נקבל‪:‬‬
‫‪u )d ( P )w ( 1  s‬‬
‫(‪x ) d‬‬ ‫( ‪P )w‬‬ ‫‪2‬‬ ‫‪‬‬ ‫‪/‬‬
‫‪v‬‬

‫( ‪)...(nimx )d( ew) ( u )d ( v P )w.‬‬ ‫‪‬‬ ‫‪s‬‬


‫‪/‬‬
‫לכן‬

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

‫יהי ‪ G‬גרף מכוון עם משקלים אי שליליים על הקשתות‪ s .‬קודקוד ב ‪ .G‬כל קשת ב ‪ G‬צבועה בצבע‬
‫כחול או אדום‪ .‬מסלול מתחלף בגרף הוא מסלול שאין בו שתי קשתות רצופות באותו צבע‪.‬‬
‫מצא את המסלול המתחלף הקל ביותר מ ‪ s‬ל ‪.t‬‬
‫‪5‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪11‬‬
‫‪s‬‬ ‫‪1‬‬ ‫‪3/6‬‬

‫‪4‬‬ ‫‪2‬‬

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

‫אלגוריתם‪:‬‬
‫המסלול המתחלף‬‫‪v R :)v B ,‬‬ ‫לכל קודקוד נחפש שני ערכים (מתייחסים לקודקוד ‪v‬כאל שני קודקודים‬
‫הקל ביותר מ ‪ s‬אליו המסתיים בקשת אדומה והמסלול המסתיים בקשת כחולה‪.‬‬
‫האתחול יהיה הכנסת ‪ s‬אדום ו ‪ s‬כחול למועמדים עם משקל זמני ‪.0‬‬
‫בשלב האיטרציה מוציאים את המועמד המינימלי ללא חשיבות לצבע‪ ,‬הופכים את הערך שלו לסופי בצבע‬
‫המתאים ומסתכלים רק על השכנים שלו בצבע הנגדי‪.‬‬
‫בסיום האלגוריתם בוחרים את המינימלי מבין ‪tR .tB ,‬‬

‫סיבוכיות‪:‬‬
‫מריצים דייקסטרה על ‪2n‬קודקודים‪ .‬בכל שלב נוספת בדיקה אחת (צבע של קשת)‪.‬‬
‫‪V ) gol‬‬
‫( ‪E O.‬‬ ‫לכן הסיבוכיות היא‬

‫הוכחה באינדוקציה על סדר הפתרון‪:‬‬

‫בסיס‪:‬‬
‫‪s‬‬
‫המסלול המתחלף הקל ביותר מ לעצמו הוא במשקל ‪.0‬‬

‫הנחת האינדוקציה‪:‬‬
‫‪B )x  ,‬‬
‫נפתרו‪R‬נכון (הערך שלהם הוא ערך המסלול המתחלף הקל‬ ‫כל הקודקודים שנפתרו לפני ‪(v x‬‬
‫‪u M‬‬ ‫( ‪M )R‬או ‪.) )B ( u‬‬ ‫ביותר המסתיים בצבע המתאים ‪-‬‬

‫הוכחה‪:‬‬
‫נוכיח עבור ‪v. R‬‬
‫המסלול)המתחלף הקל ביותר מ ‪ s‬ל ‪v‬המסתיים בקשת אדומה‪.‬‬ ‫‪( TPO,‬‬ ‫‪R v‬‬ ‫יהי‬
‫‪) ( TPO.‬‬ ‫‪R v‬‬ ‫נסמן‪u :‬הקודקוד האחרון במסלול לפני ‪v‬במסלול‬
‫( ‪) ,‬‬ ‫‪eu ) R (‬‬
‫‪| ) v(R uTPO‬‬ ‫‪vTPO.‬‬ ‫‪R v ‬‬ ‫לכן‬
‫לפי הנחת האינדוקציה‪:‬‬
‫שווה‪v,‬אך מספיקה המסקנה הזאת)‬‫הוא) | ‪u‬‬ ‫‪u M ]B [ ‬‬
‫(בעצם ( ‪R‬‬
‫‪TPO‬‬
‫( ‪nimB x )M‬‬
‫‪x ew‬‬ ‫‪] [R‬‬ ‫‪e)w( BTPO‬‬
‫‪u M‬‬ ‫‪R‬‬ ‫‪v ‬‬
‫‪E‬‬ ‫‪v)x , (e x | R‬‬ ‫‪‬‬
‫‪‬‬ ‫‪‬‬

‫תרגול ‪8‬‬
‫‪4.5.04‬‬
‫נתון גרף מכוון עם קיבולים אי שליליים על הקשתות‪ .‬קיבולת של מסלול מוגדרת כקיבולת הקשת‬
‫המינימלית במסלול‪ .‬בהנתן קודקוד ‪ s‬מצא עבור כל קודקוד ‪v‬את הקיבולת המקסימלית של מסלול מ ‪s‬‬
‫ל ‪v.‬‬

‫‪6‬‬
‫‪s‬‬ ‫‪5‬‬

‫‪3‬‬
‫‪7‬‬
‫‪2‬‬
‫‪4‬‬
‫‪9‬‬ ‫‪t‬‬
‫‪1‬‬

‫‪8‬‬

‫אלגוריתם‪:‬‬
‫האלגוריתם יפעל בדומה לדייקסטרה‪ ,‬פרט לשינויים הבאים‪:‬‬
‫אתחול – נאתחל את כל הקודקודים בקיבול זמני ‪ 0‬ונכניס את ‪ s‬למועמדים עם קיבול זמני ‪.‬‬
‫שלב – נוציא את המועמד בעל הקיבול הזמני הגדול ביותר (נחזיק ערימת מקסימום)‪ ,‬נהפוך אותו לפתור‬
‫‪u,)c ( nimv,)c ( xam v )c ( ‬‬ ‫‪‬‬ ‫‪‬‬ ‫ונעדכן את השכנים שלו‪ .‬אם ‪u‬מעדכן את ‪ v,‬אז ‪ ‬‬
‫( ‪( ( u )d ( v ,)d‬‬
‫‪v ))u e, w‬‬ ‫‪nim v .))d ( ‬‬ ‫‪‬‬ ‫‪‬‬ ‫(בדייקסטרה אם ‪u‬מעדכן את ‪ v,‬אז‬
‫( ‪v))u ,e (w( u,)c‬‬ ‫‪nim‬‬ ‫‪xam v )c ( ‬‬
‫‪E‬‬ ‫| ‪v )u ,e (u‬‬ ‫‪‬‬
‫‪‬‬ ‫‪‬‬ ‫‪‬‬

‫סיבוכיות‪:‬‬
‫השינוי מדייקסטרה הוא ערימת מקסימום במקום מינימום וחישוב שונה בכל עדכון‪ .‬לכן הסיבוכיות היא‬
‫‪V ) gol‬‬
‫( ‪E O.‬‬

‫הוכחה באינדוקציה‪:‬‬

‫בסיס‪:‬‬
‫‪.‬‬ ‫‪s‬‬
‫המסלול הריק מ לעצמו הוא בקיבול‬

‫הנחה‪:‬‬
‫הוא הקיבולת המקסימלית של מסלול מ ‪ s‬ל ‪u.‬‬
‫( ‪u )c‬‬ ‫עבור כל קודקוד ‪u‬שנפתר לפני ‪v,‬‬

‫הוכחה‪:‬‬
‫המסלול בעל הקיבולת המקסימלית מ ‪ s‬ל ‪ v.‬נסמן ב ‪u‬את הקודקוד האחרון לפני ‪v‬‬
‫‪TPO,‬‬ ‫נסמן ‪v‬‬

‫( ‪v )u ,e.‬‬ ‫‪TPO‬הקשת האחרונה‬


‫בלי‬ ‫‪| TPO‬‬
‫המסלול ‪v‬‬ ‫נסמן ב ‪ u v‬את‬ ‫‪TPO.‬‬ ‫‪v‬‬ ‫במסלול‬
‫‪)) , ( ( , | TPO nim‬‬
‫‪u v‬‬ ‫‪TPO‬‬
‫‪.‬‬ ‫‪v‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪vuew‬‬ ‫‪‬‬ ‫לפי ההגדרה‬
‫‪m‬‬ ‫‪e w u cv ‬‬
‫‪v v uTPO‬‬ ‫‪‬‬ ‫‪vuew‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪E‬‬
‫| ‪v)x , e(x‬‬ ‫‪‬‬
‫‪‬‬ ‫‪‬‬ ‫( )‬ ‫‪) ‬‬

‫הנחת האינדוקציה על ‪u‬‬ ‫מקסימום על קבוצה גדול‬


‫או שווה לכל איבר בה‬
‫נתון גרף מכוון ‪ G‬עם משקלים אי שליליים על הקשתות‪ .‬נתונים שני קודקודים ‪t .s ,‬קשת ‪e‬תקרא‬
‫מיותרת אם היא לא שייכת לאף מסלול קל ביותר מ ‪ s‬ל ‪ .t‬תאר אלגוריתם המוצא את כל הקשתות‬
‫המיותרות ב ‪.G‬‬

‫אלגוריתם‪:‬‬
‫( ‪u d.) s‬‬ ‫נריץ דייקסטרה מ ‪ s‬ונקבל לכל קודקוד ‪u‬את המרחק מ ‪ s‬ל ‪ u.‬נסמן‬
‫נהפוך את הגרף ונריץ דייקסטרה מ ‪ t‬בגרף ההפוך‪ .‬נקבל לכל קודקוד ‪u‬את המרחק הקל ביותר מ ‪ t‬ל‬
‫(‪u d.) t‬‬ ‫‪u‬בגרף ההפוך‪ .‬נסמן‬
‫( ‪v )u ,e‬‬
‫המקיימת את השוויון‬ ‫נעבור על כל הקשתות בגרף‪ .‬קשת‬
‫מיותרות‪.‬‬‫השאר‪t d‬‬ ‫))‪t ( vu‬‬
‫מיותרת‪d).‬כל ‪) t ( v‬‬ ‫‪d) s ( ‬היא‪( ( u‬‬
‫קשת‪e ,w‬‬
‫לא‬

‫סיבוכיות‪:‬‬
‫)‪V‬‬ ‫‪gol‬‬
‫( ‪E O.‬‬ ‫פעמיים דייקסטרה‬
‫( ‪E )O.‬‬ ‫הפיכת הגרף‬
‫( ‪E )O.‬‬ ‫חישוב קבוע לכל קשת‬
‫)‪V‬‬ ‫‪gol‬‬
‫( ‪E O.‬‬ ‫סה"כ‪:‬‬

‫הוכחה‪:‬‬
‫( ‪d) s‬הוא‪ u‬המרחק הקל ביותר מ ‪ s‬ל ‪u.‬‬ ‫מנכונות דייקסטרה נובע כי‬
‫הוא המרחק הקל ביותר מ ‪ t‬ל ‪v‬בגרף ההפוך ולכן הוא גם המרחק הקל ביותר בגרף המקורי מ‬ ‫(‪v d) t‬‬
‫‪v‬ל ‪.t‬‬
‫‪t d) s ( v d) t ( e w ) ( u d.) s ( ‬‬ ‫( ‪v )u ,e‬‬
‫מיותרת אם ורק אם‬ ‫נוכיח ש‬

‫כיוון ראשון‪:‬‬
‫בשרשור עם ‪e‬‬
‫( ‪u d) s‬‬ ‫‪t‬‬ ‫‪d‬‬‫)‬ ‫(‬ ‫‪v‬‬
‫המסלול המתאים ל‬
‫‪s‬‬ ‫‪d‬‬‫)‬ ‫(‬ ‫‪e‬‬ ‫‪‬‬
‫‪w‬‬ ‫)‬ ‫(‬ ‫‪u‬‬ ‫‪‬‬‫‪d‬‬‫)‬
‫‪ . s‬לכן אם נבנה ‪t‬את‬ ‫(‬ ‫‪‬‬ ‫נניח ש‬
‫נקבל מסלול מ ‪ s‬ל ‪ t‬העובר דרך ‪e‬ומשקלו מינימלי‪ .‬לכן ‪e‬‬ ‫(‪v d,) t‬‬ ‫ובשרשור עם המסלול המתאים ל‬
‫לא מיותרת‪.‬‬

‫כיוון שני‪:‬‬
‫‪t )d ( P )w. (  s‬‬ ‫נניח ש ‪e‬לא מיותרת‪ .‬לכן קיים מסלול ‪P‬מ ‪ s‬ל ‪ t‬העובר דרך ‪e‬ומקיים‬
‫‪ P, 1 ‬כך‪2 e‬ש‪P 1 P‬הוא מסלול מ ‪ s‬ל ‪u‬ו ‪P 2‬הוא מסלול מ ‪v‬ל ‪.t‬‬ ‫‪P‬בנוי בצורה‬
‫‪P )w ( 1  s‬‬
‫ובכיוון ( ‪u )d‬‬
‫ההפוך לגבי‬ ‫משום ש ‪P 1‬הוא תת מסלול של מסלול קל ביותר מ ‪ s‬ל ‪ ,t‬נקבל‬
‫‪( Pw) ( P‬‬
‫‪ w) ( t d. ) s( 2‬‬ ‫‪1‬‬ ‫‪P )w. ( 2  t‬‬
‫לכן ( ‪v )d‬‬ ‫‪P 2‬נקבל‬

‫תרגול ‪9‬‬
‫‪11.5.04‬‬

‫תרגיל‬
‫‪s‬‬
‫נתון גרף לא מכוון ‪ G‬עם משקלים אי שליליים על הקשתות‪ .‬קודקוד ב ‪ .G‬מצא את המעגל הקל ביותר‬
‫המכיל את ‪.s‬‬

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

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

‫דוגמא נגדית‪:‬‬
‫‪2‬‬

‫‪3‬‬
‫‪2‬‬ ‫‪2‬‬

‫‪3‬‬

‫‪2‬‬

‫‪2‬‬

‫דייקסטרה‬
‫‪2‬‬

‫‪3‬‬

‫‪2‬‬

‫עץ פורש מינימלי‬


‫‪2‬‬

‫‪2‬‬

‫‪) ‬‬
‫‪G‬גרף‪E V .‬‬ ‫( ‪,‬‬ ‫יהי‬
‫‪V 2 V. 1 ,‬‬ ‫חתך בגרף הוא חלוקה של הקודקודים לשתי קבוצות‪:‬‬
‫‪V V 2 V 1‬‬ ‫‪‬‬‫‪V 2 V 1‬‬
‫‪V. 2‬‬ ‫קשת בחתך היא קשת שקודקוד אחד שלה נמצא ב ‪V 1‬וקודקוד שני נמצא ב‬

‫קשת טובה – קשת שהיא מינימלית בחתך מסויים‪.‬‬


‫קשת רעה – קשת שהיא מקסימלית במעגל מסויים‪.‬‬
‫הוכח‪:‬‬
‫מכוון עם משקלים אי שליליים על הקשתות‪ ,‬כך שכל המשקלים שונים‪ ,‬אזי‬‫לא ‪E‬‬ ‫‪) ‬‬
‫‪G‬גרף ‪V‬‬ ‫( ‪,‬‬ ‫אם‬
‫קשת ‪e‬לא יכולה להיות גם טוב וגם רעה‪ .‬אנו מניחים שהגרף קשיר‪.‬‬

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

‫הוכח‪:‬‬
‫באותם תנאים כל קשת היא טובה או רעה‪.‬‬

‫הוכחה‪:‬‬

‫עץ פורש מינימלי‬

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

‫‪G‬עם ‪E V‬‬
‫משקלים אי שליליים על הקשתות‪ .‬נתון שכל המשקלים שונים‪.‬‬ ‫‪) ‬‬ ‫( ‪,‬‬ ‫נתון גרף לא מכוון‬
‫קבע‪v‬האם היא טובה או רעה‪.‬‬
‫( ‪)u ,e‬‬ ‫בהנתן קשת מסויימת‬

‫אלגוריתם‪:‬‬
‫‪u‬‬ ‫‪e‬‬ ‫‪e‬‬
‫נמחק את ואת כל הקשתות שמשקלן גדול מ מהגרף‪ .‬נריץ ‪ BFS‬מ ונבדוק האם בגרף החדש יש‬
‫מסלול ל ‪e v.‬היא קשת רעה אם ורק אם יש מסלול מ ‪u‬ל ‪v‬בגרף החדש‪.‬‬

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

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

‫סיבוכיות‪:‬‬
‫( ‪E )O.‬‬ ‫בניית הגרף החדש‬
‫‪E ) V O. ( ‬‬ ‫‪BFS‬‬
‫‪E ) V O. ( ‬‬ ‫סה"כ‪:‬‬

‫משקלים אי שליליים ונתון ‪ T‬עץ פורש מינימלי של ‪ .G‬מוסיפים לגרף קשת‬ ‫‪) ‬‬
‫‪G‬עם ‪E V‬‬ ‫( ‪,‬‬ ‫נתון גרף‬
‫‪e‬‬
‫חדשה ‪ .‬מצא את העץ הפורש המינימלי של הגרף החדש‪.‬‬

‫אלגוריתם‪:‬‬
‫נוסיף את ‪e‬לעץ הפורש המינימלי ונזרוק את הקשת המקסימלית במעגל שנוצר‪.‬‬

‫הוכחה‪:‬‬
‫נניח שכל המשקלים שונים‪ .‬הקשתות בגרף המקורי‪ ,‬פרט לקשתות ‪ T‬היו רעות‪ ,‬כלומר היה מעגל כך שהן‬
‫מקסימליות בו‪ .‬המעגלים הנ"ל לא משתנים עם הוספת קשת חדשה‪ .‬לכן הקשתות נשארות רעות‪.‬‬
‫הקשת המקסימלית במעגל שנסגר היא קשת רעה‪ .‬לכן זרקנו את כל הקשתות פרט ל ‪n  1‬קשתות‬
‫ומשום כך קיבלנו עץ פורש מינימלי‪.‬‬

‫תרגול ‪10‬‬
‫‪18.5.04‬‬

‫מציאת השמה מספקת ל ‪( 2SAT‬לאחר שמצאנו שיש פתרון)‬


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

‫שלבי האלגוריתם‪:‬‬
‫הנחה‪ :‬אין מעגל המכיל משתנה ושלילתו‪.‬‬ ‫‪-‬‬
‫נכווץ רכיבי קשירות ונעשה מיון טופולוגי‪.‬‬ ‫‪-‬‬
‫‪x i‬מופיע אחרי ‪.x i 1 ,)x i‬‬ ‫אם ‪x i‬מופיע לפני ‪x i‬במיון הטופולוגי‪ .x i 0 ,‬אחרת (אם‬ ‫‪-‬‬

‫‪x‬‬ ‫‪i‬‬ ‫‪.x‬‬


‫‪j‬‬ ‫‪x‬ו ‪x j‬‬ ‫‪i‬‬ ‫‪j (x i‬‬
‫הוא‪ x‬בעל) הערך ‪ .1‬קיימות הקשתות הבאות בגרף‪:‬‬ ‫נוכיח שהביטוי‬
‫( )‪x -N‬‬
‫המקום של‬ ‫נניח בשלילה שההשמה שבנינו אינה מספקת‪ ,‬כלומר ש ‪x i 0‬ו ‪ .x j 0‬נגדיר‪:‬‬
‫הצומת במיון הטופולוגי‪.‬‬
‫‪( xi,)‬‬
‫‪N ( j x )N ( xj, )N ( ix )N. ( j ‬‬ ‫אנו יודעים ש‬
‫מספקת‪x )N .‬‬ ‫‪j ‬‬
‫סתירה‪j x.‬לכן( ‪x )N‬‬
‫ההשמה (היא‪( i x )N‬‬ ‫) ‪i x‬‬
‫וזאת ( ‪)N‬‬ ‫‪N ( i‬‬ ‫קיבלנו ש‬

‫שאלה‬

‫למצוא עץ בעל משקל מינימלי על ‪n  1‬קודקודים‪.‬‬ ‫‪). ‬‬


‫‪G‬צריך‪E V‬‬ ‫( ‪,‬‬ ‫נתון גרף לא מכוון וממושקל‬
‫נתון האלגוריתם הבא‪:‬‬
‫מצא עץ פורש מינימלי של ‪.G‬‬ ‫‪-‬‬
‫מצא את העלה שהסרתו גורמת להקטנת המשקל של העץ באופן מקסימלי‪.‬‬ ‫‪-‬‬
‫החזר את העץ‪ ,‬פרט לעלה הנ"ל‪.‬‬ ‫‪-‬‬

‫הוכח או הפרך את האלגוריתם‪.‬‬

‫דוגמא נגדית‪:‬‬

‫‪20‬‬ ‫‪20‬‬

‫‪30‬‬

‫‪1‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪3‬‬

‫האלגוריתם יתן לנו עץ עם משקל ‪( 49‬ימחק את הקשת בעלת המשקל ‪ .)6‬העץ הפורש הקטן ביותר של‬
‫‪n  1‬צמתים הוא במשקל ‪.45‬‬

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

‫הוכחה‪:‬‬
‫תהי ‪e‬הקשת המינימלית במסלול בין ‪u‬ל ‪v‬בעץ‪.‬‬
‫נניח שיש מסלול בגרף בין ‪u‬ל ‪v‬שהקיבולת שלו גדולה מהמסלול בעץ‪ .‬לכן כל אחת מהקשתות‬
‫במסלול הנ"ל גדולה ממש מ ‪e.‬‬
‫‪e‬מגדירה חתך בגרף המפריד בין ל ‪ .‬לכן כל מסלול בין ל עובר בחתך הנ"ל לפחות פעם‬
‫‪v‬‬ ‫‪u‬‬ ‫‪v‬‬ ‫‪u‬‬
‫אחת‪.‬‬
‫משום כך המסלול בעל הקיבול הגדול ביותר בין ‪u‬ל ‪v‬מכיל לפחות קשת אחת בחתך הנ"ל ולכן ‪e‬‬
‫אינה מקסימלית בחתך שהיא מגדירה‪.‬‬
‫זאת בסתירה לכך ש ‪e‬נמצאת בעץ פורש מקסימום‪.‬‬

‫‪O‬את‪E‬הקיבול‪V V‬‬
‫המקסימלי של מסלול עבור כל זוג קודקודים‬ ‫‪ gol‬‬ ‫‪‬‬
‫‪2‬‬
‫‪‬‬ ‫מצא בזמן‬ ‫‪-‬‬
‫בגרף‪.‬‬

‫אלגוריתם‪:‬‬
‫נמצא עץ פורש מקסימום‪ .‬מכל קודקוד ‪v‬בעץ נריץ סריקה (למשל ‪ )BFS‬ונחשב את הקיבול מ ‪v‬ליתר‬
‫‪x u‬‬
‫(נניח ‪u‬קרוב יותר ל ‪ ,)v‬נסמן‬ ‫קודקודי הגרף‪ .‬כאשר מגלים בסריקה קשת‬
‫‪x u ) w, (u v,]M, [ nim‬‬‫[ ‪x v ]M. ,‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬
‫תכונות של עצים פורשים מינימלים‪:‬‬
‫האלגוריתם של עץ פורש מינימלי יעבוד גם על קשתות שליליות‪ .‬אם מעלים את כל הקשתות בסכום‬
‫מסויים‪ ,‬קשת שהיתה מינימלית בחתך תישאר מינימלית בחתך‪ .‬דרך נוספת לראות זאת היא דרך משקל‬
‫העץ‪ .‬אם אנו מעלים את כל הקשתות בסכום קבוע‪ ,‬עץ שהיה מינימלי לפני כן ישאר עץ פורש מינימלי‪.‬‬

‫תרגול ‪11‬‬
‫‪1.6.04‬‬

‫רשתות זרימה‬
‫גרף מכוון עם קודקודים ‪t s ,‬‬
‫ופונקציית קיבול אי שלילית על‬ ‫היא‪) , t‬‬
‫‪, s (N‬‬ ‫‪ ‬רשת זרימה‬
‫( ‪e )c.‬‬ ‫הקשתות‬
‫כך שהזרימה בכל קשת היא בין ‪ 0‬לקיבול הקשת‬‫( ‪e )f‬‬ ‫‪ ‬זרימה ברשת היא פונקציה על הקשתות‬
‫ולכל קודקוד (פרט ל ‪t )s ,‬סכום הזרימה הנכנסת שווה לסכום הזרימה היוצאת‪.‬‬
‫‪ ‬זרימה מקסימלית היא זרימה חוקית כך שסכום הזרימה היוצאת מ ‪ s‬הוא מקסימלי‪.‬‬
‫‪ ‬ערך הזרימה – סכום הזרימה היוצאת מ ‪.s‬‬
‫‪s‬‬
‫‪ ‬חתך ברשת – חלוקה של הקודקודים לשתי קבוצות‪ ,‬כך שקבוצה אחת מכילה את והשניה את‬
‫‪.t‬‬
‫( ‪ e )c‬‬
‫( ‪v )u , e‬‬
‫‪V u‬‬
‫‪ ‬קיבולת של חתך ‪-‬‬
‫‪s‬‬
‫‪V v‬‬ ‫‪t‬‬

‫( ‪ e )f (  e )f‬‬ ‫‪‬‬
‫( ‪v )u ,e‬‬
‫‪V u‬‬
‫( ‪v )u ,e‬‬
‫‪V u‬‬
‫זרימה בחתך ‪-‬‬ ‫‪‬‬
‫‪t‬‬ ‫‪s‬‬
‫‪V v‬‬ ‫‪s‬‬ ‫‪V v‬‬ ‫‪t‬‬

‫טענה‬
‫בזרימה חוקית הזרימה בכל חתך שווה‪.‬‬

‫משפט‬
‫‪xamwolf nim tac ‬‬
‫החתך עם הקיבול המינימלי ברשת שווה לערך הזרימה המקסימלית‪.‬‬

‫‪5/12‬‬

‫‪5/15‬‬ ‫‪4/7‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪1/3‬‬
‫‪2/4‬‬
‫‪3/10‬‬

‫‪3/10‬‬
‫‪c  22‬‬
‫‪f 7‬‬
‫‪FF‬‬
‫מתחילים עם זרימה ‪.0‬‬
‫בכל שלב מחפשים מסלול משפר זרימה ומזרימים בו ככל שניתן‪.‬‬
‫כאשר אין יותר מסלולים משפרים‪ ,‬עוצרים‪.‬‬

‫מסלול משפר – מסלול לא מכוון מ ‪ s‬ל ‪ ,t‬כך שכל קשת קדימה לא רוויה וכל קשת אחורה לא‬ ‫‪‬‬
‫ריקה‪.‬‬
‫פוטנציאל שיפור של מסלול – מינימום פוטנציאל השיפור של הקשתות בו‪.‬‬ ‫‪‬‬
‫פוטנציאל שיפור של קשת במסלול‪:‬‬ ‫‪‬‬
‫‪e ) f ( e )c ( ‬‬ ‫קשת קדימה‬
‫( ‪e )f‬‬ ‫קשת אחורה‬

‫( ‪F ) E O.‬‬ ‫‪‬‬ ‫סיבוכיות האלגוריתם תלויה בערך הזרימה‪ .‬לכן הסיבוכיות היא‬

‫הגרף לאחר שיפור אחד‪:‬‬

‫‪5/12‬‬

‫‪5/15‬‬ ‫‪5/7‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪0/3‬‬
‫‪3/4‬‬
‫‪3/10‬‬

‫‪3/10‬‬

‫‪EC‬‬
‫האלגוריתם פועל כמו ‪ FF‬עם הבדל אחד‪ :‬המסלול המשפר שנבחר יהיה הקצר ביותר האפשרי‪.‬‬
‫‪2‬‬
‫( ‪V ) E O.‬‬ ‫‪‬‬ ‫סיבוכיות‪:‬‬
‫‪V‬פעמים‪.‬‬ ‫טענה – באלגוריתם הנ"ל משתמשים בכל קשת לכל היותר‬

‫הדגמת הרצת ‪:FF‬‬


‫מתחילים עם זרימה ‪:0‬‬
‫‪120/‬‬

‫‪150/‬‬ ‫‪70/‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪0/3‬‬
‫‪0/4‬‬
‫‪0/10‬‬

‫‪0/10‬‬
‫‪‬יכול‪t‬להיות רק‬
‫‪v ‬‬
‫הראשון‬ ‫‪4‬‬
‫המשפר ‪v‬‬ ‫‪3‬‬
‫‪v s‬‬
‫(המסלול ‪v‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫המסלול המשפר הראשון‪:‬‬
‫עם קשתות קדימה‪ ,‬משום שבקשתות אחורה הזרימה היא ‪ .)0‬פוטנציאל שיפור ‪.3‬‬

‫‪123/‬‬

‫‪153/‬‬ ‫‪70/‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪3/3‬‬
‫‪0/4‬‬
‫‪3/10‬‬

‫‪3/10‬‬
‫‪‬‬
‫שיפור ‪.3t‬‬ ‫‪‬‬‫‪v .s‬‬
‫פוטנציאל ‪v‬‬ ‫‪2‬‬ ‫‪3‬‬

‫‪123/‬‬

‫‪153/‬‬ ‫‪73/‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪30/‬‬
‫‪43/‬‬
‫‪3/10‬‬

‫‪3/10‬‬
‫‪‬נהפך‪ t‬שוב למסלול משפר‪ ,‬משום שהגרף‬
‫‪v‬‬ ‫‪‬‬ ‫‪4‬‬
‫שבחרנו ‪v‬‬
‫בהתחלה‬ ‫‪3‬‬
‫‪v .s‬‬
‫המסלול ‪v‬‬ ‫‪2‬‬ ‫‪1‬‬

‫השתנה‪ .‬פוטנציאל השיפור הוא ‪.3‬‬


‫‪126/‬‬

‫‪156/‬‬ ‫‪73/‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪33/‬‬
‫‪43/‬‬
‫‪106/‬‬

‫‪106/‬‬
‫‪‬‬
‫שיפור ‪.1t‬‬ ‫‪‬‬‫‪v .s‬‬
‫פוטנציאל ‪v‬‬ ‫‪2‬‬ ‫‪3‬‬

‫‪126/‬‬

‫‪156/‬‬ ‫‪74/‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪32/‬‬
‫‪44/‬‬
‫‪106/‬‬

‫‪106/‬‬
‫‪‬‬
‫שיפור ‪3t‬‬ ‫‪‬‬‫‪v .s‬‬
‫פוטנציאל ‪v‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪129/‬‬

‫‪159/‬‬ ‫‪77/‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪32/‬‬
‫‪44/‬‬
‫‪106/‬‬

‫‪106/‬‬
‫‪t‬‬ ‫‪‬‬
‫‪v‬‬ ‫‪.‬‬ ‫‪4‬‬
‫שיפור ‪1v‬‬ ‫‪3‬‬
‫‪v .s‬‬
‫פוטנציאל ‪v‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪1210/‬‬

‫‪1510/‬‬ ‫‪73/‬‬
‫‪0/5‬‬

‫‪s‬‬ ‫‪t‬‬

‫‪33/‬‬
‫‪44/‬‬
‫‪107/‬‬

‫‪107/‬‬
‫וזוהי הזרימה המקסימלית‪.‬‬

‫טענה‬
‫החתך הוא מינימלי אם ורק אם עבור כל זרימה מקסימלית כל הקשתות קדימה יהיו רוויות וכל הקשתות‬
‫אחורה ריקות‪.‬‬

‫תרגיל‬
‫נתונה רשת זרימה וזרימה מקסימלית בה‪ .‬מצא חתך מינימלי‪.‬‬

‫אלגוריתם‪:‬‬
‫‪s‬‬
‫נסרוק מ ונתקדם רק על קשתות קדימה לא רוויות או אחורה לא ריקות‪ .‬כאשר לא נוכל להתקדם עוד‬
‫נקבל חתך מינימלי‪.‬‬
‫סיבוכיות‪.BFS :‬‬

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

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

‫הוכחה‪:‬‬
‫כיוון ‪ :1‬אם מצאנו עוד חתך‪ ,‬סימן שהוא לא יחיד‪.‬‬
‫כיוון ‪:2‬‬
‫צריך להוכיח שאם מצאנו בשתי הסריקות את אותו החתך‪ ,‬זהו החתך היחיד‪.‬‬
‫החתך הראשון שמצאנו בסריקה הראשונה הוא החתך המינימלי הקרוב ביותר ל ‪ .s‬כל חתך מינימלי אחר‬
‫‪V s V. /s‬‬ ‫בגרף בהכרח יכיל את הקבוצה המכילה את ‪.s‬‬
‫הוכחנו שהחתך הוא הכי קרוב ל ‪ .s‬אם אנו מפעילים את האלגוריתם מהכיוון השני‪ ,‬הוא הכי קרוב ל ‪.t‬‬
‫אם זהו אותו חתך‪ ,‬אז זהו החתך היחיד‪.‬‬

‫תרגול ‪12‬‬
‫‪8.6.04‬‬

‫חתך)שנמצא ע"י הרצת האלגוריתם מ ‪ s‬ומ ‪.t‬‬


‫‪V‬‬
‫‪, -tV‬‬
‫(‬ ‫‪s‬‬
‫‪Vt‬‬ ‫‪V. ‬‬
‫‪t‬‬ ‫‪ s‬ו‬
‫‪Vs / V‬‬ ‫‪/‬‬
‫‪, / tV‬‬
‫מתקיים )‬
‫‪V‬‬ ‫(‬ ‫‪/‬‬
‫‪s‬‬ ‫עבור כל חתך מינימלי‬
‫‪‬‬
‫‪Vs‬‬ ‫‪V s‬‬ ‫‪/‬‬

‫‪Vt‬‬ ‫‪V t‬‬ ‫‪/‬‬

‫תרגיל‬
‫תאר אלגוריתם הקובע האם ‪e‬‬
‫( ‪v )u ,e.‬‬ ‫נתונה רשת זרימה וזרימה מקסימלית בה‪ .‬כמו כן נתונה קשת‬
‫שייכת לאחד (או יותר) מהחתכים המינימליים ברשת‪.‬‬

‫טענה‪:‬‬
‫קשת ‪e‬שייכת לחתך מינימלי אם ורק אם כל הקטנה של הקיבולת שלה מקטינה את ערך הזרימה‬
‫המקסימלית ברשת‪.‬‬

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

‫הוכחה‪:‬‬
‫נניח ש ‪e‬שייכת לחתך מינימלי ‪ .M‬הקטנה של הקיבולת של ‪e‬ב ‪‬מקטינה את הקיבול של ‪ M‬ב ‪.‬‬
‫לכן קיבלנו חתך בקיבולת קטנה מהמינימלי בגרף המקורי ולכן הזרימה המקסימלית קטנה יותר‪.‬‬
‫נניח ש ‪e‬לא שייכת לאף חתך מינימלי‪ .‬נסמן‪ M :‬החתך המינימלי‪M / ,‬החתך הקטן ביותר המכיל את ‪e‬‬
‫‪M M /‬‬
‫‪ ,‬החתכים היחידים שיפגעו‬ ‫‪ M‬נקטין את הקיבול של ‪e‬ב‬ ‫‪M. /‬לכן אם‬ ‫‪ .‬מההנחה נובע ש‬
‫‪2‬‬
‫‪M / M /‬‬
‫הזרימה‬ ‫‪ M. ‬‬
‫לכן ‪M‬‬ ‫הם החתכים המכילים את ‪e‬וקיבולם יהיה גדול או שווה ל‬
‫‪2‬‬
‫המקסימלית אינה משתנה‪.‬‬

‫שימושים של זרימה‬

‫שידוך בגרף דו צדדי‬


‫שידוך הוא תת קבוצה של קשתות שאין לאף שתים מהן קודקוד משותף‪.‬‬

‫גודל השידוך הוא מספר הקשתות (מספר הזוגות המשודכים)‪ .‬שידוך מקסימלי הוא שידוך חוקי עם מספר‬
‫מקסימלי של קשתות‪.‬‬
‫מציאת השידוך המקסימלי נעשית ע"י הוספת כיוון לקשתות מהקבוצה הראשונה אל הקבוצה השניה‪.‬‬
‫נוסיף קודקוד ‪ s‬וקודקוד ‪ .t‬נמתח קשתות מכוונות מ ‪ s‬אל כל אחד מהקודקודים בקבוצה הראשונה‪.‬‬
‫נמתח קשתות מהקבוצה השניה ל ‪ .t‬נגדיר שלכל הקשתות יש קיבול ‪ .1‬הקיבול המקסימלי יהיה כל‬
‫הקשתות של הגרף הדו צדדי שזורם בהן משהו‪ .‬כל קשת רוויה בגרף הדו צדדי היא קשת בשידוך‪.‬‬

‫‪s‬‬ ‫‪t‬‬

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

‫סיבוכיות‪:‬‬
‫( ‪V ) E O.‬‬ ‫‪‬‬ ‫לפי ‪ FF‬הסיבוכיות תהיה‬

‫הוכחה‪:‬‬
‫ניתן להראות התאמה בין זרימה לשידוך‪ .‬אם ניתנת זרימה‪ ,‬ניתן לבנות שידוך חוקי באותו גודל‪ .‬אם ניתן‬
‫שידוך‪ ,‬ניתן לבנות ממנו זרימה‪ .‬אם אנו לוקחים זרימה מקסימלית‪ ,‬ניתן להתאים לה שידוך‪ .‬השידוך הוא‬
‫מקסימלי‪ ,‬משום שאם הוא היה יותר גדול היה ניתן לבנות ממנו זרימה גדולה יותר מהזרימה המקסימלית‪.‬‬

‫תרגיל‬
‫צריך‬ ‫הקבוצות אינן בהכרח זרות‪ .‬כולן מוכלות בקבוצה ‪. m ‬‬
‫‪,...,1‬‬ ‫‪S‬‬ ‫‪S,...,‬‬
‫‪.1‬‬ ‫‪n‬‬ ‫נתונות ‪n‬קבוצות‬
‫‪,...,‬כך ש‪y‬‬
‫‪,...,‬ו ‪y 1 x n‬‬
‫‪x1‬‬ ‫למצוא (או להגיד שאין) מערכת כפולה של נציגים‪ ,‬כלומר מספרים ‪n‬‬

‫‪y‬‬
‫שונים‪.‬‬‫‪,...,‬‬
‫‪,...,‬ו ‪y 1 x n‬‬
‫‪x1‬‬ ‫‪y i x i, ‬‬
‫וכל ‪S i‬‬
‫המספרים ‪n‬‬
‫מספרים‬ ‫קבוצות‬

‫‪2‬‬
‫‪1‬‬ ‫קשתות לפי‬
‫‪s‬‬
‫‪t‬‬ ‫שייכות בקיבול ‪1‬‬
‫‪1‬‬ ‫‪2‬‬

‫‪ 2n‬אין נציגים כאלה‪.‬‬


‫‪,‬‬ ‫‪ 2n‬יש נציגים כאלה‪ .‬אם היא קטנה מ‬
‫‪,‬‬ ‫אם הזרימה המקסימלית שווה ל‬

‫סיבוכיות‪:‬‬
‫‪m‬‬ ‫‪V. ‬‬ ‫‪ n. ‬לכן‪m‬‬ ‫לנתוני ‪V‬‬
‫השאלה‪ .‬אנו יודעים ש‬ ‫( ‪)E O‬‬ ‫‪‬‬ ‫הסיבוכיות היא של ‪ .FF‬נתרגם את‬
‫‪(E ‬סכום ‪S‬‬
‫גודל הקבוצות)‪.‬‬ ‫‪i‬‬

‫תרגול ‪13‬‬
‫‪15.6.04‬‬

‫משפט הול (משפט החתונה)‬


‫‪V A‬‬
‫מתקיים‬ ‫‪1‬‬ ‫‪V‬‬ ‫‪V‬‬ ‫‪V‬‬ ‫‪V‬‬‫)‬ ‫‪,G3 , 2 ( 1‬‬
‫גרף דו צדדי‪ .‬ב ‪ G‬יש שידוך המכסה את ‪ 1‬אם ורק אם לכל‬ ‫יהי‬
‫‪A‬‬ ‫‪A N‬‬ ‫‪.) ( ‬‬
‫קבוצת השכנים‪.‬‬ ‫‪A -N‬‬
‫( )‬

‫‪‬‬
‫‪A‬יש בן זוג‪ .‬לכן מספר השכנים הוא‬ ‫נוכיח שאם יש שידוך המכסה את ‪V, 1‬אז לכל קודקוד השייך ל‬
‫‪A‬‬ ‫‪A N‬‬ ‫‪.) ( ‬‬ ‫לפחות בגודל של הקבוצה‪ .‬משום כך לכל ‪V A 1‬‬
‫מתקיים‬

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

‫נבנה רשת זרימה ונוכיח שיש בה זרימה בגודל ‪V. 1‬‬


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

‫)‪N ( A‬‬

‫‪s‬‬
‫‪A‬‬ ‫‪t‬‬

‫עלינו להראות שיש בחתך לפחות ‪V 1‬קשתות‪ .‬אנו יודעים שמספר השכנים של ‪ A‬גדול או שווה מהגודל‬
‫של ‪.A‬‬
‫‪V1 A N‬‬ ‫‪ A V 1 ‬‬ ‫( )‬

‫תרגיל‬
‫נתון גרף דו צדדי ‪k‬רגולרי (דרגתו של כל קודקוד היא בדיוק ‪ .)k‬הוכח שבגרף יש ‪k‬שידוכים‬
‫מושלמים זרים (אין אף זוג דומה באף אחד מהשידוכים)‪.‬‬

‫הוכחה באינדוקציה‪:‬‬
‫בסיס‪ k.  1 :‬גרף ‪ 1‬רגולרי הוא שידוך מושלם‪.‬‬

‫הנחה‪:‬‬
‫עבור גרף ‪k  1‬רגולרי‪ ,‬בגרף יש ‪k  1‬שידוכים מושלמים זרים‪.‬‬

‫הוכחה‪:‬‬
‫אם נוכיח שבגרף ‪k‬רגולרי יש שידוך מושלם‪ ,‬אז אפשר למחוק שידוך זה מהגרף ולקבל גרף ‪k  1‬‬
‫רגולרי‪ .‬בגרף הזה יש לפי ההנחה ‪k  1‬שידוכים מושלמים זרים‪ .‬הם זרים גם לשידוך החדש ולכן יש ‪k‬‬
‫שידוכים מושלמים זרים‪.‬‬
‫טענה‪:‬‬
‫בגרף דו צדדי ‪k‬רגולרי יש שידוך מושלם‪.‬‬

‫הוכחה‪:‬‬
‫‪V2‬‬ ‫‪V. 1 ‬‬ ‫נראה ש‬
‫‪V k. ‬‬
‫מספר הקשתות היוצאות מ ‪V 2‬הוא אותו מספר‪:‬‬ ‫‪1‬‬ ‫מספר הקשתות היוצאות מ ‪V 1‬הוא‬
‫‪V k 1‬‬
‫‪.‬‬ ‫‪V1‬‬
‫‪k‬‬
‫‪A‬‬ ‫‪A N‬‬
‫( )‪.‬‬ ‫‪‬‬ ‫‪V A‬‬
‫מתקיים‬ ‫‪1‬‬ ‫נראה שיש שידוך המכסה את ‪V. 1‬מספיק להוכיח שלכל‬
‫‪A k‬‬ ‫‪A N‬‬
‫נכנסות לפחות‬‫( )‬ ‫‪ k. ‬לכן‬
‫‪A‬ל‬ ‫‪N‬הוא‪A‬‬
‫( )‬ ‫‪A‬ל‬ ‫‪V A‬‬
‫מספר הקשתות מ‬ ‫‪.‬‬ ‫‪1‬‬ ‫תהי‬
‫‪.A‬‬ ‫‪N‬הוא‪ A‬לפחות‬
‫( )‬ ‫‪A N‬‬
‫מקבל בדיוק ‪k‬קשתות‪ .‬לכן מספר הקודקודים ב‬‫( )‬ ‫קשתות‪ .‬כל קודקוד ב‬

‫תרגיל‬
‫נתונה רשימה ‪ M‬של מטוסים‪ ,‬רשימה ‪ N‬של נווטים ורשימה ‪ P‬של טייסים‪.‬‬
‫צריך למצוא צוות שיעלה מס' מקסימלי של מטוסים לאוויר‪ ,‬כך שכל צוות מכיל טייס ונווט‪ ,‬כאשר לכל‬
‫איש צוות נתונה רשימה של מטוסים שמותר לו לעלות אליהם‪.‬‬

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

‫‪N‬‬ ‫‪M‬‬ ‫‪P‬‬

‫‪s‬‬ ‫‪t‬‬

‫סיבוכיות‪:‬‬
‫‪ ,FF‬משום שהזרימה כאן חסומה ע"י מספר המטוסים ומספר הטייסים‪.‬‬

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

‫שיטות לפתרון בעיות זרימה‪:‬‬


‫‪ .1‬לשחק עם הקיבולות‪.‬‬
‫‪ .2‬גרף דו צדדי‪ ,‬תלת צדדי‪.‬‬
‫‪ .3‬לפצל קודקודים כדי להגביל קיבולת לקודקוד‪.‬‬

Vous aimerez peut-être aussi