1, .., sn] :טלק :Knapsack

‫מונחים‪ :‬גרף פשוט‪ :‬ללא לולאות עצמיות וקשתות מקבילות‪ .‬גרף אציקלי‪ :‬ללא‬
‫מעגלים‪ .‬גרף קשיר‪ :‬גרף לא מכוון עם מסלול בין כל זוג קדקודים‪.m ≥ n − 1 .‬‬
‫גרף קשיר בחזקה‪ :‬גרף מכוון עם מסלול מכוון בין כל זוג קדקודים‪ .‬ניתן לפרק‬
‫לרק"חים‪ .‬עץ‪ :‬גרף לא מכוון‪ ,‬קשיר ואציקלי‪ .‬מסלול אוילר‪ :‬מסלול בגרף‬
‫שעובר על כל קשת בדיוק פעם אחת‪ .‬מעגל אוילר‪ :‬מסלול אוילר שמתחיל‬
‫ומסתיים באותו קדקוד‪ .‬גרף דו צדדי‪ :‬אמ"מ אפשר לצבוע את קדקודיו של‬
‫גרף לא מכוון בשני צבעים‪ ,‬כך שאף קשת לא מחברת בין שני קדקודים בעלי‬
‫אותו צבע‪ G = (U, W, E) .‬כך ש ‪U ∩ W = ∅ ,U, W ⊆ V‬‬
‫ואין קשתות בין ‪ U‬ל ‪ .W‬זיווג‪ :‬קבוצת קשתות זרות בקדקודים‪ .‬גודל הזיווג‬
‫= מס' הקשתות בקבוצה‪ .‬זיווג מקסימום‪ :‬זיווג עם מס' מקס' של קשתות מבין‬
‫‪ . n‬קדקוד מנתק‪ :‬קדקוד בגרף לא‬
‫הזיווגים שבגרף‪ .‬זיווג מושלם‪ :‬זיווג בגודל‬
‫‪2‬‬
‫מכוון אשר הסרתו )יחד עם הקשתות הסמוכות אליו( מגדילה את מס' רכיבי‬
‫הקשירות של הגרף‪ .‬קבוצת מוצא‪ :‬קבוצת קדקודים אשר יש ממנה מסלול לכל‬
‫קדקוד בגרף‪ .‬גרף על‪ :‬גרף המכיל קדקוד עבור כל רק"ח של הגרף המקורי‪.‬‬
‫לכל זוג רק"חים עם קשת אחת לפחות בינם‪ ,‬תהיה קשת אחת בין הקדקודים‬
‫המייצגים אותם‪ .‬תמיד אציקלי וניתן למיון טופ'‪ .‬מעגל פשוט‪ :‬עוברים על‬
‫נמצא גם במעגל פשוט‪.‬‬
‫כל קדקוד פעם ‪ .1‬כל קדקוד שנמצא במעגל רגיל‪ ,‬‬
‫ייצוג גרפים‪ :‬מטריצה‪ :‬גרף מכוון‪/‬לא מכוון ללא משקל‪) O n2 :‬ביט ‪ 1‬או‬
‫‬
‫‬
‫‪ .(0‬גרף מכוון‪/‬לא מכוון עם משקלים ‪.O n2 · log(W ) :1, . . . ., W‬‬
‫רשימת שכנויות )מערך של הקדקודים‪ ,‬כשמכל אחד מהם יוצאת רשימה מקשורת‬
‫‪:‬‬
‫של שכנים(‪ .O (n · logn + m · logn) :‬שימושי כשהגרף דליל‪.‬‬
‫)‪ δ(s, v‬־ המרחק הקצר ביותר בקשתות מ ‪ s‬ל ‪ ∞ .v‬אם אין מסלול מ ‪s‬ל‬
‫‪ .v‬א"ש ה‪ .δ(s, v) ≤ δ(s, u) + 1 ⇐ (u, v) ∈ E :4‬יהי ‪ u‬הקדקוד‬
‫הלפני אחרון על מק"ב מ ‪ s‬ל ‪ ,v‬אז‪ .δ(s, u) = δ(s, v) − 1 :‬האלג'‪:‬‬
‫אתחול‪ :‬לכל ‪.d[v] = ∞, π[v] = N IL, col[v] = white :v ∈ V‬‬
‫‪ .d[s] = 0, col[s] = grey‬מכניסים את ‪ s‬לתור‪ .‬כל עוד התור לא‬
‫ריק‪ ,‬מוציאים קדקוד ‪ ,u‬ועוברים על כל השכנים שלו‪ .‬לכל שכן‪ ,‬אם צבעו לבן‪:‬‬
‫‪ ,col[v] = grey, d[v] + +, π[v] = u‬ונכניסו לתור‪ .‬בסיום טיפול‬
‫בשכנים‪ .col[u] = black :‬הפ' ‪ π‬מקודדת את המסלול הקצר ביותר )בכיוון‬
‫ההפוך(‪ .‬סיבוכיות‪ .O(m + n) :‬שימושים‪ :‬בדיקה האם יש מסלול מ ‪ u‬ל‬
‫‪ .v‬מציאת אורכו של המסלול הקצר ביותר מ ‪ u‬ל ‪ .v‬מציאת רכיבי קשירות‬
‫בגרף לא מכוון‪ .‬מציאת עץ מק"בים ‪ +‬גרף מק"בים מ ‪ s‬לשאר הקדקודים‬
‫)‪ BF S‬שזורק קשתות רק באותה רמה(‪ .‬גרף מסלולים מ ‪ s‬ל ‪ t‬־ ‪BF S‬‬
‫‪ d[u] :‬־ זמן‬
‫מ ‪ s‬ו ‪ BF S‬מ ‪ t‬ב ‪ GT‬בלי לזרוק קשתות כלל‪.‬‬
‫התחלת הטיפול ב ‪ f [u] ,u‬־ זמן הסיום‪ .‬האלג'‪ :‬מאתחלים את ‪ time‬ל‬
‫‪ ,0‬את הצבעים של כל הקדקודים ללבן‪ ,‬את האבות שלהם ל ‪ .N IL‬בלולאה‪:‬‬
‫אם הצבע של ‪ u‬לבן‪ ,‬קוראים ל )‪ .DF S _visit(u‬בתוך ‪DF S _visit‬‬
‫־ צובעים את ‪ u‬באפור ו ‪ .d[u] = + + time‬בלולאה ־ לכל ‪ v‬שכן‬
‫של ‪ ,u‬אם הצבע שלו לבן‪ ,π(v) = u ,‬וקוראים ל )‪.DF S _visit(v‬‬
‫אחרי שהלולאה מסתיימת‪ .f [u] = + + time ,‬תכונות פ' הזמן‪ u :‬הוא‬
‫צאצא של ‪ v‬אמ"מ ]]‪ u .[d[u], f [u]] ⊂ [d[v], f [v‬הוא אב קדמון של‬
‫‪ v‬אמ"מ ]]‪ u .[d[u], f [u]] ⊃ [d[v], f [v‬לא מיוחס ל ‪ v‬אמ"מ המקטעים‬
‫]]‪ [d[u], f [u‬ו ]]‪ [d[v], f [v‬זרים‪ .‬משפט המסלול הלבן‪ u :‬אב קדמון של ‪v‬‬
‫ביער ‪ DF S‬אמ"מ בזמן ]‪ d[u‬יש מסלול מ ‪ u‬ל‪ v‬שכולו לבן‪ .‬סיווג הקשתות‪:‬‬
‫‪ :T reeEdge‬חלק מעץ ה ‪ :BackEdge .DF S‬מצומת ‪ u‬לאב קדמון של‬
‫‪) u‬לא חלק מהעץ(‪ :F orwardEdge .‬קשת מעבר לצאצא )לא חלק מהעץ(‪.‬‬
‫‪ :CrossEdge‬קשת בין שני צמתים שאינן צאצאים‪ .‬משפט‪ :‬בעץ ‪ DF S‬של‬
‫גרף לא מכוון כל הקשתות הן או ‪ T reeEdge‬או ‪ .BackEdge‬למה‪ :‬גרף‬
‫מכוון ‪ G‬הוא אציקלי אמ"מ אין ‪ BackEdge‬ב )‪ .DF S(G‬מיון טופולוגי‪:‬‬
‫קיים לכל גרף אציקלי‪ .‬זמני הסיום )]‪ (f [u‬של כל קדקוד קובעים את הסדר‬
‫הטופולוגי ־ קדקוד מוקדם יותר הוא קדקוד בעל זמן סיום גבוה יותר‪ .‬אלג'‬
‫למציאת רק"חים‪ (*) :‬מריצים ‪ ,DF S‬ושומרים ערכי ‪ (*) .f‬מגדירים ∗ ‪,DF S‬‬
‫שעובר על הצמתים של ‪ V‬ע"פ הסדר העולה של ערכי )‪ (*) . f (u‬מריצים‬
‫‬
‫‪ (*) .BF S ∗ GT‬כל עץ שמתקבל ביער ה ‪) DF S‬השני( הוא רק"ח של‬
‫‪BFS‬‬
‫‪DFS‬‬
‫‪) G‬וגם של ‪ .(GT‬למה‪ :‬יהי )‪ G = (V, E‬ויהיו ‪ C‬ו ‪ C 0‬שני רק"חים‪ ,‬כך‬
‫ש ‪ .C 6= C 0‬נניח כי הקשת ‪) (u, v) ∈ E‬כש ‪ .(v ∈ C 0 ,u ∈ C‬אזי‪,‬‬
‫) ‪ ,f (C) > f (C 0‬כאשר )‪ .f (C) = maxv∈C f (v‬עפ"מ‪ :‬הגדרות‪ :‬חתך‬
‫)‪ (S, V \S‬־ חלוקה של ‪ V‬ל ‪ 2‬קבוצות זרות‪ .‬קשת חוצה חתך ־ קשת )‪(u, v‬‬
‫כש ‪ u ∈ S‬ו ‪ .v ∈ V \S‬חתך מכבד את ‪ A‬־ אין קשת ב ‪ A‬שחוצה את‬
‫החתך‪ .‬קשת קלה ־ קשת חוצה חתך בעלת משקל מינ'‪ .‬תתכן יותר מאחת‪ .‬משפט‪:‬‬
‫)‪ (u, v‬היא קשת בטוחה עבור ‪ A ⊆ E‬אם היא קשת קלה שחוצה חתך שמכבד‬
‫את ‪ .A‬קרוסקל‪ :‬משתמשים ב ‪ .union − f ind‬האלג'‪ (1) :‬ממיינים קשתות‬
‫לפי משקל‪ (2) .‬עוברים עליהן בסדר עולה‪ :‬אם ‪ u, v‬לא שייכים לאותה הקבוצה ־‬
‫נעשה להם ‪ union‬ונצרף את )‪ (u, v‬לקבוצת הקשתות שטופלו‪ .‬תמיד אפשרות‬
‫לשנות את סדר בחירת הקשתות‪ ,‬כדי לקבל עפ"מ מסוים )למשל עם מספר קשתות‬
‫אדומות מקס'(‪ .‬סיבוכיות‪) O (m · log(n)) :‬בגלל המיון(‪ .‬פרים‪ :‬בונים עץ‬
‫החל מקדקוד מוצא שרירותי‪ .‬בכל שלב מוסיפים לו קודקוד אשר עלות חיבורו לעץ‬
‫היא מינימלית ־ את המינימום משיגים בעזרת תור עדיפויות‪ .‬בכל פעם שולפים את‬
‫המינ' ‪ u‬מהתור‪ ,‬ועבור כל ‪ v‬שכן שלו בודקים ־ אם )‪,d[v] > d[u] + w(u, v‬‬
‫ומעדכנים בהתאם‪ .‬הערה‪ :‬אם יש מס' קבוע של משקלים‪ ,‬אפשר לעשות כמה‬
‫לינארי‪ ,‬וקרוסקל ב )‪ .α(m)log(n‬סיבוכיות‪ :‬תלוי‬
‫בזמן ‬
‫תורים‪ ,‬ואז פרים פועל ‬
‫במימוש התור‪ :‬מערך ־ ‪ ,O n2‬ערימת מינימום ־ ))‪ ,O (m · log(n‬ערימת‬
‫פיבונאצ'י ־ ))‪ .O (m + n · log(n‬בעיות מק"בים‪ :‬בעיית היעד היחיד שקולה‬
‫לבעיית המוצא היחיד‪ .‬אין דרך לפתור את בעיית הזוג היחיד מלבד שימוש באלג'‬
‫לבעיית המוצא היחיד ושליפת התוצאה עבור ‪ .t‬תכונות‪ (1) :‬כל תת מסלול של‬
‫מסלול מינ' מ ‪ s‬ל ‪ v‬גם הוא מינ' )‪ (2‬יהי ‪ u‬הקדקוד הלפני אחרון על מסלול‬
‫מינ' מ ‪ s‬ל ‪ ,v‬אז )‪ (2) δ(s, v) ≡ δ(s, u) + w(u, v‬א"ש המשולש‪ :‬לכל‬
‫‪ (u, v) ∈ E‬מתקיים )‪ (4) δ(s, v) ≤ δ(s, u) + w(u, v‬אם אין מעגלים‬
‫שליליים בגרף‪ ,‬אז יש מסלול מינ' פשוט‪ .‬שיטת פורד‪ :‬לכל קודקוד ‪d[v] :v‬‬
‫משקל מינ' מ ‪ s‬ל ‪ v‬שגילינו עד כה‪ .‬בסוף ההרצה מתקיים )‪.d[v] = δ(s, v‬‬
‫]‪ :π[v‬הקדקוד שנמצא לפני ‪ v‬על המסלול המינ' שגילינו‪ .‬אלג' מופשט‪ :‬אתחל‬
‫)∞ = ]‪ π(v) = N IL ,d[v‬לכל ‪ ,(d[s] = 0 ,v‬ובצע שיפורי קשתות כל‬
‫עוד אפשר לשפר‪ ,‬בעזרת )‪ :Relax(u, v‬אם )‪d(v) > d(u) + w(u, v‬‬
‫אז‪ d(v) = d(u) + w(u, v) :‬ו ‪ .π(v) = u‬אם יש מעגל שלילי נגיש מ‬
‫‪ ,s‬האלג' לא יעצור‪ .‬תכונות של ‪) :Relax‬א( הערך של ]‪ d[v‬יורד מונ' במהלך‬
‫ריצת האלג'‪) .‬ב( בכל שלב שבו ∞ =‪ d[v] ,d[v] 6‬הוא משקלו של מסלול מ‬
‫‪ s‬ל ‪ v‬אשר מגיע ל ‪ v‬דרך ]‪) .π[v‬ג( בכל שלב‪) .d[v] ≥ δ(s, v) :‬ד(‬
‫אם נבצע ‪ Relax‬לקשתות במק"ב שמוביל לקדקוד ‪ v‬בסדר שלהן במסלול‪,‬‬
‫נקבל כי )‪ d[v] = δ(s, v‬בלמן־פורד‪ :‬מבצעים ‪ n‬איטרציות שעוברות על‬
‫כל הקשתות‪ ,‬ומשפרים בעת הצורך‪ .‬האלג'‪ :‬מאתחלים‪ ,‬ואז מבצעים ‪Relax‬ים‬
‫על כל הקשתות בתוך לולאה כפולה‪ .‬עוברים עוד פעם על כל הקשתות ע"מ‬
‫לתפוס מעגלים שליליים )אם יש אפשרות לשפר ־ קיים מעגל שלילי(‪ .‬סיבוכיות‪:‬‬
‫)‪ Θ (n · m‬־ ‪ n‬איטרציות על כל ‪ m‬הקשתות‪ .‬דייקסטרה‪ :‬פועל רק על גרף‬
‫עם משקלים אי שליליים‪ .‬סדר הקדקודים במסלול הוא סדר עולה של מרחקם‬
‫מ ‪ .s‬האלג'‪ :‬מאתחלים כרגיל‪ .‬כל עוד לא ביקרנו בכל הקדקודים‪ ,‬שולפים את‬
‫‪ u‬שעבורו ]‪ d[u‬הוא המינימלי מבין אלה שטרם ביקרנו בהם‪ .‬משפרים את כל‬
‫הקשתות לשכניו של ‪ .u‬סיבוכיות‪ :‬תלוי במימוש התור ־ ע"ׂע פרים‪ .‬גרף מק"בים‬
‫מ ‪ :s‬מריצים דייקסטרה )או ‪ .(BF‬עוברים על כל הקשתות ושומרים רק את‬
‫אלה שמקיימות )‪ d[u] = d[v] + w(u, v‬מק"בים בין כל זוגות הקדקודים‪:‬‬
‫‬
‫‬
‫פתרון נאיבי ־ הרצת ‪ BF‬מכל קדקוד ־ ‪ .O n2 m‬כפל מטריצות‪ :‬נניח‬
‫שאין מעגלים שליליים‪ ,‬ונמספר את הקדקודים }‪ .V = {1, ...n‬נגדיר‬
‫‪ i n‬ל ‪ j‬שמכיל לכל היותר ‪ m‬קשתות‪.‬‬
‫‪ o‬משקל המסלול המינ' במשקל מ‬
‫)‪ dm (i, j‬־‬
‫)‪.dm (i, j) = min1≤k≤n dm−1 (i, k) + w(k, j‬‬
‫מתקיים‪:‬‬
‫כיוון שאין מעגלים שליליים‪δ(i, j) = dn−1 (i, j) = dn (i, j) = :‬‬
‫‪ ....‬האלג'‪ :‬מחשב את )‪ D (m‬בהינתן )‪ D (m−1‬ומטריצת המשקלים‬
‫‪ .W‬עבור כל תא במטריצה )‪) D (m‬בתוך לולאה כפולה( עוברים על כל‬
‫ה ‪k‬ים מ ‪ 1‬עד ‪) n‬ע"ע הנוסחה למעלה( )לולאה שלישית(‪ ,‬ומנסים למצוא‬
‫את המסלול המינ' באורך לכל היותר ‪ m‬קשתות מ ‪ i‬ל ‪ .j‬ב ‪ D‬כבר‬
‫יש את המסלולים המינ' מכל קדקוד לכל קדקוד באורך לכל היותר ‪m − 1‬‬
‫קשתות‪ ,‬לכן‪ ,‬צריך למצוא את ה‪ k‬שנותן את ‪ dik + wkj‬המינ'‪ .‬סיבוכיות‪:‬‬
‫‬
‫‬
‫ ‬
‫‪) O n4‬שלוש לולאות‪ n ,‬פעמים(‪ .‬אפשר לשפר ל )‪O n3 log(n‬‬
‫אם משתמשים בעובדה ש ‪ .W 2k = W k · W k‬פלויד־ווארשל‪ :‬נניח‬
‫שאין מעגלים שליליים‪ .‬נגדיר )‪ δk (i, j‬־ משקל המסלול המינימלי במשקל‬
‫מ ‪ i‬ל ‪ j‬שעובר רק דרך קדקודים }‪) {1, ..., k‬פרט ל ‪ .(i, j‬נקבל‪:‬‬
‫‬
‫‬
‫)‪,δk (i, j) = min δk−1 (i, j), δk−1 (i, k) + δk−1 (k, j‬‬
‫כאשר )‪ δk−1 (i, k) + δk−1 (k, j‬אומר שבחרנו לעבור ב ‪ , k‬ו‬
‫)‪ δk−1 (i, j‬אחרת‪ .‬מימוש‪ :‬מערכים דו ממדיים ‪ d‬עבור המרחקים‪ ,‬ו ‪ p‬עבור‬
‫המסלולים‪ d[i, j] .‬־ משקל המסלול המינימלי מ ‪ i‬ל ‪ j‬שמצאנו עד כה )לאחר ‪k‬‬
‫איטרציות מכיל את )‪ p[i, j] .(δk (i, j‬־ הקדקוד האחרון לפני ‪ j‬על המסלול‬
‫המינימלי מ ‪ i‬ל ‪ j‬שמצאנו עד כה‪ .‬האלג'‪ :‬מאתחלים את המערכים )‪,d[i, i] = 0‬‬
‫אם ‪ (i, j) ∈ E‬אז )‪ .(d[i, j] = w(i, j‬בלולאה הראשונה בודקים ־ אם‬
‫‪ d[k, k] < 0‬אז יש מעגל שלילי בגרף‪ .‬בתוך שתי לולאות מקוננות‪ ,‬לכל תא‬
‫‪d[i, j] = d[i, k]+d[k,‬‬
‫בודקים‪ :‬אם ]‪ ,d[i, j] > d[i, k]+d[k, j‬אז ]‪ j‬‬
‫ו ]‪ .p[i, j] = p[k, j‬סיבוכיות‪ :‬שלוש לולאות ־ ‪ .O n3‬ג'ונסון‪ :‬נפעיל‬
‫פונקציה על המשקלים בגרף‪ ,‬כך שהמשקלים החדשים ‪ w0‬יקיימו ‪ 2‬תנאים‪.1 :‬‬
‫מק"ב נשאר מק"ב תחת הפונקציה‪ .2 .‬כל המשקלים אי שליליים‪ .‬הפונקציה‪:‬‬
‫נצרף קדקוד ‪ s‬ל ‪ .V‬נחבר אותו בקשתות לכל קדקודי הגרף )עם משקל ‪ .(0‬על‬
‫יתר הקשתות נפעיל‪ .w0 (u, v) = w(u, v) + δ(s, u) − δ(s, v) :‬את‬
‫המרחקים )‪ δ(s, v‬נחשב באמצעות הפעלה יחידה של בלמן־פורד על ‪ .s‬האלג'‪:‬‬
‫החדשה‪ ,‬ומפעילים דייקסטרה מכל קדקוד‪ .‬סיבוכיות‪:‬‬
‫מחשבים את פונ' המשקלים ‬
‫‬
‫)‪ .O m · n + n2 · log (n‬תכנות דינאמי‪ :‬שלבי פתרון הבעיות‪.1 :‬‬
‫הגדרת תתי בעיות‪ .2 .‬מציאת הקשר לפתרון השאלה‪ .3 .‬חישוב מקרי‬
‫בסיס‪ .4 .‬חישוב תתי בעיות באמצעות תתי בעיות קטנות מהן‪ .5 .‬סיבוכיות‪.‬‬
‫‪ :‬קלט‪ S = [s1 , .., sn ] :‬קבוצה של ‪ n‬עצמים‪ ,‬כאשר לכל‬
‫עצם ‪ si‬מותאמים שני ערכים‪ wi :‬־ הנפח של ‪ bi ,si‬־ הערך של ‪ W .si‬־‬
‫נפח מקס' לכלל החפצים‪ .‬פלט‪ :‬תת קבוצה של ‪ S‬אשר נפחה הכולל אינו עובר‬
‫את ‪ W‬וסכום ערכי העצמים בה מקס' )ביחס לשאר תתי הקבוצות שנפחן אינו‬
‫עובר את ‪ .(W‬הרעיון‪ :‬נגדיר את )‪ B(i, w‬להיות סכום הערכים המקסימלי‬
‫שאפשר להרכיב מ ‪ s1 , s2 , ..., si‬שנפחם הכולל לא עובר את ‪ .w‬נחפש את‬
‫) ‪ .B(n, W‬מתקיים‪ :‬אם ‪ w < wi‬אז )‪ ,B(i, w) = B(i − 1, w‬אחרת‪:‬‬
‫}) ‪ .B(i, w) = max {B(i − 1, w), bi + B (i − 1, w − wi‬תנאיי‬
‫התחלה‪ :‬אם ‪ w < wi‬אז ‪ ,B(1, w) = 0‬אחרת ‪.B(1, w) = b1‬‬
‫האלג'‪ :‬אתחול ־ נמלא את השורה הראשונה של הטבלה ‪) V‬בטבלה תהיינה‬
‫‪n‬שורות )החפצים( ו ‪ W‬עמודות(‪ .‬אתחול שורה ראשונה ־ נרוץ על ‪ w‬מ ‪0‬‬
‫ועד ‪ ,W‬ועבור כל ‪ w‬נבדוק‪ :‬אם ) ‪ (w < w1‬אז ‪ ,V [1, w] = 0‬אחרת‬
‫‪ .V [1, w] = b1‬בתוך לולאה כפולה‪ ,‬בכל שורה ‪ i‬ועמודה ‪ w‬נבדוק‪ :‬אם‬
‫) ‪ (w < w1‬אז ]‪ ,V [i, w] = V [i − 1, w‬אחרת‪ ,‬נחשב שני ערכים‪:‬‬
‫] ‪ valW ithIth = bi + V [i − 1, w − wi‬ו = ‪valW ithoutIth‬‬
‫]‪ V [i − 1, w‬וב ]‪ V [i, w‬נשים את המקס' מהם‪ .‬סיבוכיות‪ :‬מילוי כל‬
‫משבצת במטריצה ־ )‪ .O(1‬במטריצה יש ‪ n · W‬משבצות ) ‪ W‬קבוע(‪ ,‬כלומר‬
‫הסיבוכיות הסופית היא )גם זמן וגם מקום(‪ .O(n · W ) :‬ניתן לחסוך במקום‬
‫‪ :‬תהי ‪X = hx1 , ..., xm i‬‬
‫־ מספיק לשמור את השורה הקודמת‪.‬‬
‫סדרה‪ .‬אזי ‪ Z = hz1 , ..., zk i‬היא תת"ס של ‪ X‬אם קיימת סדרה‬
‫עולה ממש של אינדקסים ‪ hi1 , ..., ik i‬של ‪ X‬כך שלכל ‪j = 1, 2, ..., k‬‬
‫מתקיים ‪ .xij = zj‬הרעיון‪ :‬נגדיר את ]‪ c[i, j‬להיות האורך של ‪LCS‬‬
‫של ‪ Xi‬ו ‪ Yj‬ונקבל‪) c[i, j] = 0 (*) :‬אם ‪ i = 0‬או ‪,(j = 0‬‬
‫)*( ‪) c[i, j] = c[i − 1, j − 1] + 1‬אם ‪ i, j > 0‬ו ‪(xi = yj‬‬
‫)*( )]‪) c[i, j] = max (c[i, j − 1], c[i − 1, j‬אם ‪ i, j > 0‬וגם‬
‫‪ .(xi 6= yj‬האלג'‪ :‬אתחול ־ נבנה טבלה בגודל ‪ n) n × m‬־ אורך ‪,X‬‬
‫‪ m‬־ אורך ‪ .(Y‬נמלא את השורה הראשונה ואת העמודה הראשונה של הטבלה‬
‫באפסים )תנאיי התחלה(‪ .‬נריץ ‪ 2‬לולאות מקוננות‪ ,‬אחת עד ‪ n‬ואחת עד ‪ .m‬בכל‬
‫שלב‪ ,‬נבדוק‪ :‬אם ) ‪ ,(xi = yj‬אז ‪.c[i, j] = c[i − 1, j − 1] + 1‬‬
‫אחרת‪ ,‬נבדוק‪ :‬אם )]‪ (c[i − 1, j] ≥ c[i, j − 1‬אז = ]‪c[i, j‬‬
‫]‪ ,c[i − 1, j‬אחרת ]‪ .c[i, j] = c[i, j − 1‬סיבוכיות‪ :‬זמן ומקום )‪.O(mn‬‬
‫רשת זרימה‪ :‬הגדרות‪ :‬פ' הזרימה חייבת לקיים שלושה אילוצים‪ .1 :‬אילוץ הקיבול‪:‬‬
‫)‪ .2 .f (u, v) ≤ C(u, v‬אנטי־סימטריה‪.f (u, v) = −f (v, u) :‬‬
‫‪P‬‬
‫‪ .3‬שימור הזרימה‪ :‬לכל ‪ u 6= s, t‬מתקיים ‪. v∈V f (u, v) = 0‬‬
‫‪P‬‬
‫‪P‬‬
‫= | ‪ .|f‬הערה‪ :‬זרימת‬
‫= )‪v∈V f (s, v‬‬
‫ערך הזרימה‪v∈V f (v, t) :‬‬
‫ה־‪ 0‬תמיד חוקית‪ .‬החתך‪ :‬חתך ) ‪ (S, T‬־ חלוקה של ‪ V‬לשתי קבוצות זרות‬
‫כאשר ‪ s ∈ S‬ו ‪ .t ∈ T‬קיבול חתך‪ :‬סכום הקיבולים החוצים את החתך‪:‬‬
‫‪P‬‬
‫‪P‬‬
‫= ) ‪ .C(S, T‬זרימה בחתך‪ :‬סכום הזרימות‬
‫‪u∈S‬‬
‫)‪v∈T C(u, v‬‬
‫‪P‬‬
‫‪P‬‬
‫= ) ‪ .f (S, T‬לכל חתך‬
‫‪f‬‬
‫‪(u,‬‬
‫)‪v‬‬
‫החוצות את החתך‪:‬‬
‫‪u∈S‬‬
‫‪v∈T‬‬
‫) ‪ (S, T‬מתקיים ) ‪ .f (S, T ) ≤ C(S, T‬למת החתך‪ :‬תהי ‪ f‬זרימה‪ ,‬ויהי‬
‫) ‪ (S, T‬חתך‪ ,‬אז | ‪ .f (S, T ) = |f‬משפט ‪:M ax F low ,M in Cut‬‬
‫תהי ‪ f‬זרימה ברשת ‪ .G‬התנאים הבאים שקולים‪ f (1) :‬זרימה מקסימלית ב ‪G‬‬
‫)‪ (2‬בגרף השיורי אין מסלול מ ‪ s‬ל ‪) t‬אין מסלול משפר( )‪ (3‬קיים חתך ) ‪(S, T‬‬
‫שעבורו ) ‪) |f | = C(S, T‬חתך רווי(‪ .‬מקרה פרטי ־ רשת ‪ :0 − 1‬הערכים‬
‫הבאים שווים‪ (1) :‬ערך הזרימה המקסימלית )‪ (2‬גודל החתך המינ' )‪ (3‬המס'‬
‫‪Knapsack‬‬
‫‪LCS‬‬
‫המקס' של מסלולים זרים בקשתות )‪ (4‬מס' הקשתות המינ' שיש להסיר כדי לנתק‬
‫את הגרף )‪ (5‬גודל זיווג המקסימום‪ .‬חתך מינ'‪ :‬קיום חתך מינ' המכיל קשת ‪:e‬‬
‫מקטינים את הקיבול של ‪ .e‬אם החתך המינ' קטן‪ ,‬היה חתך מינ' שהכיל‬
‫את ‪ .e‬האם כל חתך מינ' מכיל את ‪ :?e‬מגדילים את הקיבול של ‪ .e‬אם‬
‫החתך המינ' גדל‪ e ,‬משתתפת בכל חתך מינ'‪ .‬הגבלת זרימה ברשת‪ :‬בקדקודים‪:‬‬
‫משכפלים כל קדקוד ל־‪ 2‬קדקודים ‪ vin , vout‬ובינם קשת בקיבול ‪ .1‬כל‬
‫מסלול בזרימה חוקית ברשת זר בקדקודים‪ .‬בקשתות‪ :‬פשוט ניתן קיבול‬
‫‪ .1‬קשת דו כיוונית‪ :‬אם יש קשת )‪ (u, v‬וגם קשת )‪ (v, u‬ורוצים לוודא‬
‫שרק אחת מהן תיבחר בזרימה‪ ,‬נהפוך את הקשתות ‪ e1‬ו ‪ e2‬לקדקודים‬
‫וניצור את הקשתות‪.(u, e1 ), (v, e1 ), (e1 , e2 ), (e2 , v), (e2 , u) :‬‬
‫כל מסלול שעובר בקדקודים ‪ u, v‬יהיה חייב לעבור בקשת ) ‪.(e1 , e2‬‬
‫זרימה בין קבוצות‪ :‬עבור ‪ X, Y ⊆ V‬הזרימה מ ‪ X‬ל ‪ Y‬היא = ) ‪f (X, Y‬‬
‫‪P‬‬
‫‪P‬‬
‫‪ . u∈X‬תכונות ‪ :‬תהיינה ‪ X, Y, Z ⊆ V‬קבוצות‪ .‬אז‪:‬‬
‫)‪v∈Y f (u, v‬‬
‫)‪) (3) f (X, X) = 0 (2) f (X, Y ) = −f (Y, X) (1‬חוק הפילוג( אם ∩ ‪X‬‬
‫∅ = ‪ Y‬אז‪f (X ∪ (b) f (Z, X ∪ Y ) = f (Z, X) + f (Z, Y ) (a) :‬‬
‫)‪ .Y, Z) = f (X, Z) + f (Y, Z‬מציאת זרימה מקסימלית‪ :‬פורד פלקרסון‪:‬‬
‫)לא אלג' חמדן ־ מאפשר "חרטות"(‪ .‬מושגים‪ :‬קיבול שיורי ‪ :Cf‬כמות הזרימה‬
‫שאפשר עדיין להזרים לאורך קשת‪.Cf (u, v) = C(u, v) − f (u, v) :‬‬
‫תמיד מתקיים ‪ .Cf (u, v) ≥ 0‬ייתכן כי )‪) Cf (u, v) > C(u, v‬יכולה‬
‫להיות זרימה שלילית בקשת(‪ .‬הקיבול השיורי של מסלול ‪ :P‬זהו הקיבול השיורי‬
‫המינימלי לאורך ‪ .Cf (P ) = min(u,v)∈P Cf (u, v) :P‬קשת משפרת‪:‬‬
‫קשת )‪ (u, v‬שאפשר "להזרים" לאורכה עוד זרימה )קשת בלתי רוויה(‪.‬‬
‫מסלול משפר‪ :‬מסלול מ ‪ s‬ל ‪ t‬שמורכב כולו מקשתות משפרות )קיבולו השיורי‬
‫חיובי(‪ .‬הגרף השיורי ‪ :Gf‬מכיל את כל הקשתות המשפרות )קשתות שקיבולן‬
‫השיורי חיובי( ⇐ כל מסלול מ ‪ s‬ל ‪ t‬ב ‪ Gf‬הוא מסלול משפר‪ .‬האלג'‪.1 :‬‬
‫אתחול‪ .2 .Gf (u, v) = G(u, v) .f (u, v) = f (v, u) = 0 :‬כל עוד‬
‫יש מסלול מ ‪ s‬ל ‪ t‬בגרף ‪) Gf‬מסלול משפר(‪) :‬א( נמצא מסלול כזה ‪ P‬ונחשב‬
‫את קיבולו השיורי ) ‪) Cf (P‬ב( נגדיל את הזרימה ב ‪ G‬לאורך ‪ P‬ב ) ‪:Cf (P‬‬
‫לכל קשת )‪ (u, v‬במסלול ‪ P‬נעדכן‪ ,f (u, v) = f (u, v) + Cf (P ) :‬ו‬
‫)‪ .3 .f (v, u) = −f (u, v‬נעדכן את הגרף השיורי לאורך המסלול ‪ P‬־‬
‫לכל קשת )‪ (u, v‬במסלול ‪ P‬נעדכן‪Cf (u, v) = C(u, v) − f (u, v) :‬‬
‫ו )‪ .Cf (v, u) = C(v, u) − f (u, v‬סיבוכיות‪ :‬מס' איטרציות ×‬
‫עלות כל איטרציה‪ .‬עלות כל איטרציה‪ :‬תמיד )‪) O (m + n) = O (m‬גרף‬
‫קשיר(‪ ,‬נשתמש ב ‪ BF S‬או ‪ .DF S‬מס' איטרציות‪ M F :‬־ ערך הזרימה‬
‫המקסימלית‪ .‬אם הקיבולים שלמים‪ ,O (M F · m) ,‬אם הקיבולים רציונליים‪,‬‬
‫)‪ cd) O (M F · cd · m‬־ המכנה המשותף לכל הקיבולים(‪ .‬אדמונדס־קארפ‪:‬‬
‫האלג'‪ (1) :‬אתחול‪ :‬זרימה ‪ 0‬בכל הקשתות‪ (2) .Cf (u, v) = C(u, v) ,‬כל‬
‫עוד יש מסלול מ ‪ s‬ל ‪ t‬בגרף ‪) Gf‬מסלול משפר(‪) :‬א( נמצא מסלול ‪ P‬משפר ע"י‬
‫‪ BF S‬ונחשב את קיבולו השיורי ) ‪) Cf (P‬ב( לכל קשת )‪ (u, v‬במסלול ‪P‬‬
‫נעדכן‪ f (u, v) = f (u, v) + Cf (P ) :‬ו )‪(3) .f (v, u) = −f (u, v‬‬
‫לכל קשת )‪ (u, v‬במסלול ‪ P‬נעדכן‪.Cf (u, v) = C(u, v) − f (u, v) :‬‬
‫)‪ (4‬בסיום‪ ,‬נחזיר את ‪ .f‬טענה‪ :‬כל קשת יכולה להיות "צוואר בקבוק" )קיבולה‬
‫‪ n‬איטרציות‪.‬‬
‫כקיבול השיורי של המסלול המשפר עליו היא נמצאת( לכל היותר ב‬
‫‪2‬‬
‫‪ m‬קשתות‪ ,‬מס' האיטרציות חסום ע"י )‪ .O (m · n‬סיבוכיות‪:‬‬
‫כיוון שיש ‬
‫‬
‫‪) O n · m2‬מס' האיטרציות חסום ע"י ‪ m · n‬ועלות כל איטרציה נשארת‬
‫לינארית‪ ,‬כי ‪ BF S‬לינארי(‪ .‬טענה זו נכונה גם אם הקיבולים אינם שלמים‪.‬‬
‫אם בוחרים תמיד מסלול משפר בעל קיבול שיורי מקסימלי‪ ,‬והקיבולים שלמים‪,‬‬
‫מס' האיטרציות אינו עולה על ) ‪ .2|m| · log (Cmax‬דיניץ‪ :‬הגדרות‪ :‬גרף‬
‫השכבות‪ :‬גרף שכבות ה ‪) BF S‬גרף המסלולים הקצרים ביותר‪ BF S .‬שלא‬
‫"מוחק קשתות" בין רמות עוקבות( של ‪ L (G) :Gf‬־ גרף זה מורכב אך ורק‬
‫מהמסלולים הקצרים ביותר מ ‪ s‬בגרף השיורי‪ .‬בשכבה ‪ k‬מופיעים כל הקדקודים‬
‫שמרחקם מ ‪ s‬הוא ‪ .k‬השכבה האחרונה תכיל את ‪ .t‬זרימה חוסמת‪ :‬אמ"מ‬
‫כל מסלול מ ‪ s‬ל ‪ t‬כולל לפחות קשת אחת רוויה‪ .‬האלג'‪ (1) :‬אתחול‪f :‬‬
‫זרימה ‪ ,0‬הגרף השיורי הוא ‪ G‬עצמו‪ (2) .‬כל עוד ‪ t‬נגיש מ ‪) :s‬א( בנה‬
‫מהגרף השיורי את גרף השכבות )‪) L(G‬ב( מצא זרימה חוסמת ‪ g‬ב )‪L(G‬‬
‫)ג( עדכן ‪ .f = f + g‬מציאת זרימה חוסמת‪ :‬כל עוד יש קשתות יוצאות מ‬
‫‬
‫‬
‫‪ s‬ב ‪ (1) :L Gf‬הרץ ‪ DF S‬על ‪ L Gf‬מ ‪ ,s‬עד שתגיע לצומת ‪ v‬עם‬
‫דרגת יציאה ‪ (2) 0‬אם ‪ ,v = t‬שפר את הזרימה לאורך מסלול ה ‪ DF S‬מ‬
‫‬
‫‪ s‬ל ‪ t‬וסלק מ ‪ L Gf‬קשתות במסלול שהקיבול השיורי שלהן הפך ל ‪,0‬‬
‫‬
‫וחזור חלילה מ ‪ (3) s‬אחרת )‪ ,(v 6= t‬סלק מ ‪ L Gf‬את כל הקשתות‬
‫הנכנסות אל ‪ ,v‬והמשך בביצוע ה ‪ .DF S‬סיבוכיות‪ .‬עלות פאזה באלג'‪ :‬הפאזה‬
‫מורכבת מ‪ (1) :‬בניית הרשת השיורית ־ )‪) O (m‬גרף קשיר( )‪ (2‬בניית רשת‬
‫שכבות ‪ BF S‬מ ‪ s‬עד ‪ t‬־ )‪ BF S) O (m‬לינארי( )‪ (3‬זמן מציאת זרימה‬
‫חוסמת לרשת השכבות ־ )‪) t (n, m‬בהמשך( )‪ (4‬עדכון הזרימה ־ )‪O (m‬‬
‫סה"כ‪ .O (m + t (n, m)) :‬עלות מציאת זרימה חוסמת‪ :‬הצעדים הם‪(1) :‬‬
‫‪ extend‬־ ‪ DF S‬צועד לעומק‪ retreat (2) .‬־ הגענו לקדקוד ללא קשתות‬
‫יוצאות שאיננו ‪ breakthrough (3) .t‬־ הגענו ל ‪ .t‬עלות המציאה הכוללת‪:‬‬
‫‪ ,#extends + #retreats + n · #breakthoughs‬כי בפאזה מסוימת‬
‫נעשה לקשת ‪ extend‬פעם אחת לכל היותר‪ ,‬נעשה ‪ retreat‬פעם אחת לכל‬
‫היותר מכל קדקוד )אם ביצענו ‪ ,retreat‬מחקנו את הקשתות הנכנסות לקדקוד‬
‫זה‪ ,‬ולא נוכל לחזור אליו שוב( וכל ‪ breakthrough‬עולה לנו )‪ O (n‬־‬
‫הגענו ל ‪ t‬־ צריך לחשב את הקיבול השיורי של המסלול וזרימה ־ מעבר על‬
‫כל קדקודי המסלול‪ .‬מתקיים‪) #breakthroughs ≤ m :‬כי מס' הדרכים‬
‫להגיע ל ‪ t‬הוא לכל היותר )‪ ,O (m‬ובכל פעם לפחות קשת אחת הופכת לרוויה(‪,‬‬
‫‪) #retreats ≤ m‬כי לפחות קשת אחת נמחקת כל פעם כתוצאה מפעולת‬
‫‪ (retreat‬ו ‪#extends ≤ #retreats + n · #breakthroughs‬‬
‫)כי כל נסיגה עולה לנו בהרחבה‪ ,‬וכל פריצה עולה לנו ב )‪ O (n‬הרחבות(‪ .‬אז‬
‫נקבל כי‪t (n, m) =≤ m + (m + n · m) + n · m = O (m · n) :‬‬
‫‪ .#extends + #reatreats + n · #breakthroughs‬סה"כ עלות‬
‫פאזה‪ .O (m · n) :‬טענה‪ :‬מס' הפאזות באלג' דיניץ חסום ע"י ‪ n − 1‬כיוון‬
‫שבכל פאזה המרחק בקשתות מ ‪ s‬ל ‪t‬עולה ממש )ואורך המסלול המקסימלי‬
‫הוא ‪ .(n − 1‬הסיבוכיות‪ .O n2 · m :‬מקרים פרטיים‪ (1) :‬ר"ז ‪ 0/1‬־‬
‫הפאזות לאעולה‬
‫לינארי‬
‫)‪ ,O(m‬ומס' ‬
‫‬
‫הזרימההחוסמת בזמן ‬
‫אפשר למצוא את ‬
‫‪2‬‬
‫‪1‬‬
‫‪2‬‬
‫ √‬
‫‪ O‬ו ‪ ,O n 3‬אז סך הכל‪.O min n 3 , m 2 · m :‬‬
‫על ‪m‬‬
‫)‪ (2‬רשת )‪ (type − 2‬שבה לכל קדקוד )פרט ל ‪ s‬ו ‪ (t‬יש או קשת כניסה‬
‫יחידה בקיבול ‪ ,1‬או קשת יציאה יחידה בקיבול ‪ ,1‬וכל שאר הקיבולים הם‬
‫‬
‫√‬
‫‪ .O‬תכנות לינארי‪n :‬‬
‫‪n·m‬‬
‫מס'ים שלמים אקראיים‪ .‬הסיבוכיות‪:‬‬
‫משתנים ‪ m ,x1 , .., xn‬א"ש לינאריים )אילוצים(‪ ,‬פ' מטרה לינארית )מינ'‬
‫או מקס'(‪ .‬פתרון פיזיבילי‪ :‬הצבת ערכים ל ‪ x1 , .., xn‬כך שכל הא"ש‬
‫מתקיימים‪ .‬יכולות להיות ‪ 3‬אפשרויות‪ (1) :‬קיים פתרון אופ' )‪ (2‬הפתרון לא‬
‫חסום )‪ (3‬אין פתרון‪ .‬צורה סט'‪ (*) :‬פ' המטרה היא מקס' )*( כל האילוצים‬
‫‪Pn‬‬
‫)*( קיים אילוץ חיוביות על כל ‪ .xi‬המרה‬
‫מהצורה ‪j=1 aij xj ≤ bi‬‬
‫לצורה סט'‪ :‬שוויון‪ :‬נהפוך שוויון לשני א"ש ־ ≥ ו ≤‪ .‬חוסר אילוץ חיוביות‪:‬‬
‫נהפוך את ‪ xi‬ל ) ‪ ,(xi1 − xi2‬ונוסיף אילוץ לשניהם ‪.xi1 , xi2 ≥ 0‬‬
‫א"ש הפוך )או פ' מטרה מינ'(‪ :‬נכפול ב ‪ .−1‬צורת ‪ n (*) :Slack‬משתנים‬
‫‪P‬‬
‫לא בסיסיים ו ‪ m‬משתנים בסיסיים )*( פ' מטרה‪ max v + j cj xj :‬מכילה‬
‫רק מש' לא בסיסיים )*( אילוצי חיוביות לכל המשתנים )*( לכל משתנה בסיסי קיים‬
‫‪P‬‬
‫שוויון ‪ xk ) xk = bi − j aij xj‬בסיסי‪ xj ,‬לא(‪ .‬המרה לצורת ‪:Slack‬‬
‫‪Pn‬‬
‫‪Pn‬‬
‫‪bi −‬‬
‫נהפוך ל = ‪j=1 aij xj‬‬
‫כל א"ש מהצורה ‪j=1 aij xj ≤ bi‬‬
‫‪ xj ) xn+i‬הם משתנים לא בסיסיים‪ xn+i ,‬כן( ונוסיף ‪.xn+1 ≥ 0‬‬
‫הבעיה הדואלית‪ (*) :‬מתחילים בצורה הסט' )*( כל משתנה הופך לאילוץ‪ ,‬וכל‬
‫אילוץ למשתנה )*( פ' המטרה הופכת למינ' )*( הא"ש משנים כיוון )*( אילוצי‬
‫החיוביות נשארים‪ ,‬אבל בשביל המשתנים החדשים‪ .‬מעבר לדואלית‪ :‬אם היה לנו‬
‫‪Pn‬‬
‫‪Pn‬‬
‫ל ‪,i = 1, ..., m‬‬
‫‪ ,max‬א"ש‪j=1 aij xj ≤ bi :‬‬
‫‪j=1 cj xj‬‬
‫‪P‬‬
‫‪ ,min m‬א"ש‬
‫‪b‬‬
‫‪y‬‬
‫נקבל‪:‬‬
‫‪,j‬‬
‫=‬
‫‪1,‬‬
‫‪..,‬‬
‫‪n‬‬
‫ל‬
‫‪x‬‬
‫≥‬
‫אילוצים‪0 :‬‬
‫‪j‬‬
‫‪i=1 i i‬‬
‫‪Pm‬‬
‫ל ‪ ,j = 1, .., n‬אילוצים ‪ yi ≥ 0‬ל ‪.i = 1, ..., m‬‬
‫‪i=1 aij yi ≥ cj‬‬
‫משפט הדואליות‪ :‬אם ל קיים פתרון פיזיזילי אופ'‪ ,‬אז ערך הפתרון האופ' של‬
‫הבעיה הפרימאלית = ערך הפתרון האופ' של הדואלית‪ .‬פיזיביליות לינארית‪:‬‬
‫נתונים ‪ m‬א"ש ו ‪ n‬משתנים‪ .‬צריך למצוא הצבה המספקת את כל האילוצים‪.‬‬
‫תרגילים וטענות מתרגולים‪ :‬מסלול‪/‬מעגל אוילר‪ :‬גרף )לאו דווקא פשוט( קשיר‬
‫ולא מכוון מכיל מעגל אוילר אמ"מ לכל קדקוד ‪ u ∈ V‬יש דרגה זוגית‪ .‬גרף קשיר‬
‫ולא מכוון מכיל מסלול אוילר )שאינו מעגל( אמ"מ הוא מכיל בדיוק שני קדקודים‬
‫מדרגה אי זוגית‪ .‬גרף דו"צ‪ :‬גרף הינו דו"צ אמ"מ הוא אינו מכיל מעגל באורך‬
‫אי זוגי‪ .‬צביעת הגרף בשני צבעים‪ (1) :‬נבחר שרירותית קדקוד ונריץ ממנו‬
‫‪ (2) BF S‬את הקדקודים ברמות הזוגיות בעץ ה ‪ BF S‬נצבע בצבע אחד‪,‬‬
‫והקדקודים ברמות האי זוגיות בשני‪ .‬גרף מק"בים מ ‪ :s‬גרף ) ‪G0 = (V, E 0‬‬
‫כך ש‪ e ∈ E 0 :‬אמ"מ ‪ e‬חלק ממק"ב מ ‪ .s‬מציאת גרף המק"בים‪ :‬נריץ מ‬
‫‪ BF S s‬עם שינוי ־ נזרוק מהגרף רק קשתות בין קדקודים באותה הרמה‪.‬‬
‫סיבוכיות‪ .O(m + n) :‬מציאת גרף המק"בים מ ‪ s‬ל ‪ t‬בגרף מכוון‪ :‬נריץ מ ‪s‬‬
‫‪ BF S‬שלא יזרוק קשתות ברמות עוקבות‪ .‬נהפוך את קשתות הגרף‪ ,‬ונריץ מ‬
‫‪ t‬את ה ‪ BF S‬החדש‪ .‬נהפוך בחזרה את קשתות הגרף‪ .‬זהו ‪ ,DAG‬ואפשר‬
‫למצוא בו את גרף המסלולים הקלים ביותר בזמן לינארי )ע"י מיון טופולוגי וביצוע‬
‫פעולות ‪ Relax‬ע"פ סדר טופ'(‪ .‬סיבוכיות‪ .O(m + n) :‬קדקודים מנתקים‪:‬‬
‫מציאת כל הקדקודים המנתקים של גרף לא מכוון‪ (1) :‬נריץ ‪ DF S‬על הגרף‪,‬‬
‫ונשמור את זמני הגילוי )‪ (2‬יודעים ששורש הנו קדקוד מנתק אמ"מ יש לו לפחות‬
‫‪ 2‬ילדים )‪ (3‬עלה לא יכול להיות קדקוד מנתק )‪ (4‬תוך כדי הרצת ‪ DF S‬נחשב‬
‫לכל קדקוד )בזמן הסיום שלו(‪low[v] = min {d[v], d[u], low[u]} :‬‬
‫כאשר ]‪ d[u‬מחושב אם )‪ (v, u‬היא קשת אחורית‪ ,‬ו ]‪ low[u‬מחושב אם ‪u‬‬
‫הוא צאצא של ‪ (5) v‬קדקוד ‪ v‬שאינו שורש או עלה בעץ הנו קדקוד מנתק‬
‫אמ"מ קיים ‪ u‬בן של ‪ v‬אשר עבורו מתקיים ]‪ .low[u] ≥ d[v‬סיבוכיות‪:‬‬
‫)‪ . O(m + n‬קבוצת מוצא‪ :‬מציאת קבוצת מוצא בגרף מכוון‪ (1) :‬נבנה‬
‫את גרף העל‪) :‬א( נחשב רק"חים )‪ ,DF S‬הפיכת קשתות ושוב ‪) (DF S‬ב(‬
‫נבחר קודקוד אחד מכל רק"ח להיות הנציג של הרק"ח )ג( גרף העל הוא‬
‫אציקלי‪ ,‬לכן ניתן למיין אותו טופולוגית )‪ (2‬נמצא את קבוצת המקורות ‪:S‬‬
‫)א( נעבור על קדקודי הגרף לפי הסדר הטופולוגי ‪ ,‬ולכל קדקוד ‪ v‬שנעבור‬
‫בו‪ ,‬נסמן את הקדקודים שיש ממנו קשת אליהם )ב( כאשר נגיע לקדקוד‬
‫שאינו מסומן‪ ,‬נכניס את אחד מקדקודי הרק"ח שהוא מייצג ל ‪ .S‬סיבוכיות‪:‬‬
‫)‪ .O(m + n‬בדיקת קיום מסלול העובר בכל קדקודי קבוצה ‪(1) :S ⊆ V‬‬
‫נמצא את הרק"חים של הגרף )‪ (2‬נחפש בגרף העל מסלול אשר עובר דרך כל‬
‫הרק"חים המכילים לפחות איבר אחד מ ‪) :S‬א( נמיין טופולוגית את גרף העל‬
‫)ב( נטייל על גרף העל לפי הסדר הטופולוגי )ג( בכל פעם שנגיע לאיבר המייצג‬
‫רק"ח רלוונטי‪ ,‬נבדוק האם קיים מסלול ממנו אל הרק"ח הרלוונטי הבא )בסדר‬
‫הטופולוגי( )ד( חיפוש מסלול מקדקוד ‪ v‬אל קדקוד ‪ u‬יתבצע באמצעות ‪BF S‬‬
‫מ־ ‪ v‬על תת הגרף בין ‪ v‬לבין ‪ .u‬סיבוכיות‪ .O(m + n) :‬עפ"מים‪ :‬נתונים שני‬
‫עפ"מים ‪ .T1 , T2‬טענה‪ :‬לכל מס' ממשי ‪ r‬מתקיים‪ :‬תהי ‪ E1,r‬קבוצת הקשתות‬
‫‬
‫של ‪ T1‬שמשקלן לכל היותר ‪) r‬כנ"ל ‪ E2,r‬ו ‪ .(T2‬בגרפים ‪ V, E1,r‬ו־‬
‫‬
‫‪ V, E2,r‬יש בדיוק אותם רכיבי קשירות‪ .‬טענה‪ :‬תהי ‪α1 ≤ ... ≤ αn−1‬‬
‫רשימה ממוינת של משקלי קשתות ‪ .T1‬כנ"ל ‪ β1 ≤ ... ≤ βn−1‬ו ‪ .T2‬אז‬
‫‪ .∀i : αi = βi‬מציאת עפ"מ עם מס' קשתות אדומות מקס'‪ :‬כל קשת‬
‫בגרף צבועה בכחול או אדום‪ .‬נרצה למצוא מבין העפ"מים את זה שמכיל את מס'‬
‫הקשתות האדומות המקס'‪ .‬דרך א‪ :‬נגדיר קבוע ‪ ε‬ונתייחס למשקל של קשת כחולה‬
‫‪ e‬כאל ‪ .w(e) + ε‬נריץ את קרוסקל על הגרף עם פ' המשקל החדשה‪ ,‬ונמצא‬
‫עפ"מ‪ .‬בחירת ‪ (1) :ε‬אם נסמן את משקל העפ"מים בגרף המקורי בתור ‪ ,m‬ואת‬
‫משקל העץ השני הקל ביותר ב ‪ ,m2‬נרצה שיתקיים‪.m + (n − 1)ε < m2 :‬‬
‫)‪ (2‬אפשר לקחת ‪ ,ε < ∆min‬כאשר ‪ ∆min‬היא ההפרש הקטן ביותר בין‬
‫משקלי ‪ 2‬קשתות בגרף )לוקח הרבה זמן(‪ .‬סיבוכיות‪ :‬כמו של קרוסקל‪ .‬דרך ב‪:‬‬
‫נסדר את הקשתות לפי משקל ואז לפי צבע בהרצת קרוסקל‪ .‬סיבוכיות‪ :‬כמו‬
‫של קרוסקל‪ .‬מס' קבוע של משקלים‪ :‬שומרים תור נפרד לכל משקל )ולאינסוף(‪,‬‬
‫ומריצים פרים‪ .‬שומרים מצביע מהקדקוד לאיבר בתור‪ .‬כשרוצים לעדכן את ערך‬
‫]‪ , d[v‬מוציאים את ‪ v‬מהתור‪ ,‬ומעבירים אותו לתור האחר בזמן קבוע‪ .‬סיבוכיות‪:‬‬
‫לינארית‪ .‬בלמן פורד‪ :‬ארביטראז'‪ :‬נתונים ‪ n‬סוגי מטבעות‪ ,‬וטבלת מחירי המרה‬
‫ביניהם‪ .‬תארו אלג' הבודק האם ניתן להתחיל עם מטבע אחד מסוג ‪ i‬ולבצע סדרת‬
‫המרות שבסופה נקבל יותר ממטבע אחד מסוג ‪ .i‬פתרון‪ ai,j (1) :‬־ מס' מטבעות‬
‫‪ cj‬שאפשר לקבל תמורת מטבע ‪ (2) .ci‬נבנה גרף מכוון ‪ G‬עם צומת לכל סוג‬
‫‬
‫מטבע‪ ,‬וקשת בין כל זוג צמתים )‪ ai,j (3‬־ משקל הקשת ‪ (4) ci , cj‬המשקל‬
‫של מעגל ‪ ci1 → ... → ci → ci1‬יהיה ‪.ai1 ,i2 + ... + ai ,i1‬‬
‫‪k‬‬
‫‪k‬‬
‫⇒⇐‬
‫מחפשים מעגל שמקיים‪ai1 ,i2 + ... + ai ,i1 > 1 :‬‬
‫‬
‫‬
‫‪ k‬‬
‫‬
‫‬
‫‬
‫‪⇐⇒ log ai1 ,i2 + log ai2 ,i3 + ... + log ai ,i1 > 0‬‬
‫‬
‫‬
‫‬
‫‬
‫‪ k‬‬
‫‬
‫‪(5) −log ai1 ,i2 − log ai2 ,i3 − ... − log ai ,i1 < 0‬‬
‫‪k‬‬
‫‬
‫לקשת מ ‪ ci‬ל ‪ cj‬ניתן משקל ‪ (6) −log ai,j‬קיים רצף המרות שמביא‬
‫ ‬
‫לרווח אמ"מ בגרף החדש יש מעגל שלילי )‪ (7‬נשתמש ב ‪ BF‬בסיבוכיות ‪.O n3‬‬
‫הגרף קשיר בחזקה ולכן נוכל להריץ ‪ BF‬מכל קדקוד‪ .‬המסלול הקל לקדקוד‪:‬‬
‫אין מעגלים שליליים‪ .‬לכל ‪ v ∈ V‬מגדירים‪δ ∗ (v) = minu∈V δ(u, v) :‬‬
‫־ משקל המסלול הקל ביותר מהמסלולים שמסתיימים ב ‪ .v‬תארו אלג' שמחשב‬
‫את כל ערכי )‪ .δ ∗ (v‬פתרון‪ (1) :‬תמיד יהיה אי חיובי )כי קיים מסלול באורך‬
‫‪ 0‬מהקדקוד לעצמו( )‪ (2‬נוסיף קדקוד ‪ s‬ונוציא ממנו קשתות במשקל ‪ 0‬לכל‬
‫‪ (3) v ∈ V‬נריץ ‪ ,BF‬ועבור כל קדקוד ‪ v ∈ V‬נציב )‪.δ ∗ (v) = δ(s, v‬‬
‫סיבוכיות‪ :‬כמו של ‪ .BF‬מעגל במשקל ‪ :0‬נתון שאין מעגלים שליליים‪ .‬האם‬
‫קיים מעגל במשקל ‪ ?0‬פתרון‪ (1) :‬נוסיף קדקוד ‪ s‬וקשת במשקל ‪ 0‬לכל‬
‫‪ (2) .v ∈ V‬נריץ ‪ BF‬מ ‪ (3) s‬ניצור תת גרף ‪G0 = hV, E 0 i‬‬
‫כאשר })‪) E 0 = {(u, v) ∈ E | δ(s, v) = δ(s, u) + w(u, v‬גרף‬
‫המק"בים שיוצאים מ ‪ ,(s‬כלומר‪ ,‬קשת נשארת בגרף אמ"מ היא חלק ממק"ב‬
‫היוצא מ ‪ (4) s‬אם קיים בגרף מעגל‪ ,‬בהכרח משקלו ‪ (5) 0‬אם היה מעגל‬
‫במשקל ‪ 0‬ב ‪ ,G‬הוא קיים ב ‪ .G0‬סיבוכיות‪ :‬כמו של ‪ .BF‬דייקסטרה‪:‬‬
‫מציאת הילוך קל עם קשתות בצבעים‪ :‬נתון גרף מכוון‪ . w(e) ≥ 0 ,‬כל קשת‬
‫בגרף צבועה באדום או כחול‪ .‬תארו אלג' למציאת ההילוך הקל ביותר מ ‪ s‬ל‬
‫‪ t‬מבין ההילוכים עם מס' זוגי של קשתות אדומות )אפשר לחזור על קשתות(‪.‬‬
‫פתרון‪ (1) :‬נפצל כל קדקוד ‪ v ∈ V‬לשני קדקודים ‪(2) vo , ve ∈ V 0‬‬
‫‪ vo‬־ הגענו ל ‪ v‬אחרי מס' א"ז של קשתות אדומות‪ ,‬ו ‪ ve‬אחרי מס' זוגי‬
‫)‪ (3‬לקשתות אדומות ‪ (u, v) ∈ E‬נגדיר‪(ue , vo ) , (uo , ve ) ∈ E 0 :‬‬
‫)‪ (4‬לכחולות ‪ (u, v) ∈ E‬־ ‪ (5) (ue , ve ) , (uo , vo ) ∈ E 0‬נחפש ב‬
‫‪ G0‬את המסלול הקל ביותר מ ‪ se‬ל ‪ .te‬סיבוכיות‪ :‬כמו של דייקסטרה‪.‬‬
‫מק"בים עם משקלים שליליים‪ :‬נתון גרף מכוון‪ .w(e) ≤ 0 ,s ∈ V ,‬אין‬
‫מעגלים שליליים‪ .‬תארו אלג' למציאת מק"בים מ ‪ s‬אל שאר הקדקודים‪ .‬פתרון‪:‬‬
‫)‪ (1‬פתרון נאיבי ־ ‪ BF‬מ ‪ .s‬סיבוכיות‪ (2) O (mn) :‬נתון שאין מעגלים‬
‫שליליים בגרף ⇐ המעגלים היחידים שיכולים להיות הם מעגלים במשקל ‪⇐ 0‬‬
‫אם קיים רק"ח‪ ,‬כל הקשתות בו במשקל ‪ .0‬כלומר‪ ,‬לקדקודים באותו רק"ח‬
‫יהיו מק"בים באותו משקל‪ .‬מספיק למצוא את המרחק של כל רק"ח מ ‪(3) s‬‬
‫נבנה את גרף העל ונמצא את המק"בים בו‪ .‬סיבוכיות‪ :‬בגרף אציקלי אפשר‬
‫למצוא מק"בים בזמן לינארי‪ .‬משקלים עם הגבלה‪ :‬נתון ‪ s ∈ V‬ופ' משקל‬
‫}‪ .w : E → {0, 1, 2‬תארו אלג' למציאת מק"בים מ ‪ .s‬פתרון‪(1) :‬‬
‫פתרון נאיבי ־ דייקסטרה מ ‪ .s‬סיבוכיות‪ (2) .O (m + nlogn) :‬נשפר את‬
‫דייקסטרה‪ .‬נשנה את תור העדיפויות‪ ,‬כך שכל פעולה תדרוש זמן קבוע‪ ,‬ונקבל‬
‫אלג' עם זמן ריצה לינארי‪ .‬משקל כל מסלול יהיה בין ‪ 0‬ל )‪) 2(n − 1‬או‬
‫אינסוף(‪ .‬נחזיק מערך בגודל ‪ ,2n‬כך שכל תא יתאים למשקל אפשרי של מק"ב‪.‬‬
‫איברי הרשימה בתא ‪ i‬יתאימו למסלולים במשקל ‪ i‬שבוחנים בשלב זה‪ .‬עלות‬
‫הוצאת האיבר המינ' מהתור‪) :‬א( נחזיק משתנה ‪ p‬שיצביע לתא המינימלי שאינו‬
‫ריק במערך‪ .‬בפעולת ‪ extractM in‬נוציא את האיבר שנמצא בראש הרשימה‬
‫אשר בתא ש ‪ p‬מצביע אליו ־ )‪) .O(1‬ב( מס' התא ש ‪ p‬מצביע עליו יכול רק‬
‫לגדול‪ ,‬ולכן סך עלות העדכון של ‪ p‬היא )‪ .O(n‬סה"כ סיבוכיות זמן ומקום‪:‬‬
‫)‪ .O(m + n‬הערה‪ :‬אם משקלי הקשתות האפשריים הם }‪,{0, 1, 2..., k‬‬
‫הסיבוכיות עולה ל )‪ .O (m + kn‬תכנות דינמי‪ :‬מנורות וקומות‪ n :‬קומות ו‬
‫‪ m‬מנורות‪ .‬רוצים לדעת כמה זריקות נצטרך לכל היותר כדי לדעת בוודאות‬
‫מאיזו קומה מנורה נפתחת‪ .‬תתי בעיות‪ c(w, f ) :‬־ מס' הזריקות שצריך‬
‫עבור ‪ w‬מנורות ו ‪ f‬קומות‪ .‬הקשר לפתרון‪ :‬נרצה למצוא את )‪c(n, m‬‬
‫בסיס‪ .∀j : c(1, j) = j ,∀k : c(k, 1) = 1 :‬חישוב‪c(k, j) = :‬‬
‫‪ .mini {max [c(k, j − i), c(k − 1, i − 1)]}+1‬סיבוכיות‪ :‬מחשבים‬
‫)‪ c(k, j‬לכל ‪ ,k, j‬כלומר סך הכל )‪ O(mn‬חישובים‪ .‬כל חישוב הוא‬
‫לכל היותר ‪ n‬השוואות של ‪ 2‬ערכים שכבר חישבנו‪ ,‬וחישוב מינימום על ‪n‬‬
‫ערכים ־ )‪ .O(n‬סה"כ‪:‬‬
‫‪ .O mn2‬מסיבה‪ :‬מארגנים מסיבה‪ .‬לכל‬
‫עובד יש רמת כיפיות‪ .‬לא מזמינים שני אנשים כשאחד הבוס הישיר של השני‪,‬‬
‫ולכן מחזיקים את עץ הכפיפויות של העובדים‪ .‬רוצים למצוא את תת קבוצת‬
‫העובדים עם רמת הכיפיות המקס'‪ .‬תתי בעיות‪ :‬לכל צומת ‪ v‬בעץ נגדיר ‪:‬‬
‫)*( )‪ f un+ (v‬־ הכיפיות המקס' לתת העץ של שורש ‪ v‬כש ‪ v‬מוזמן )*(‬
‫)‪ f un− (v‬־ כנ"ל‪ ,‬כש ‪ v‬לא מוזמן )*( )‪ f un(v‬־ רמת הכיפיות של ‪(*) v‬‬
‫)‪ child(v‬־ קבוצת הבנים הישירים של ‪ v‬בעץ‪ .‬הקשר לפתרון‪ r :‬־ שורש‬
‫‪n‬‬
‫‪o‬‬
‫העץ‪ .‬רוצים למצוא‪ max f un+ (r), f un− (r) :‬בסיס‪ :‬אם ‪ v‬עלה ‪:‬‬
‫)*( )‪ .f un− (v) = 0 (*) f un+ (v) = f un(v‬חישוב‪ :‬אם ‪ v‬אינו‬
‫‪P‬‬
‫‪−‬‬
‫‪f un+ (v) = f un(v) +‬‬
‫עלה אז‪u∈child(v) f un (v) (*) :‬‬
‫‬
‫‬
‫‪P‬‬
‫‪+‬‬
‫= )‪.f un− (v‬‬
‫‪max‬‬
‫‪f‬‬
‫‪un‬‬
‫‪(v),‬‬
‫)*( )‪f un− (v‬‬
‫)‪u∈child(v‬‬
‫סיבוכיות‪ :‬אם מס' העובדים הוא ‪ (1) :n‬לכל עובד מחשבים ‪ 2‬ערכים‪ ,‬כאשר‬
‫כל ערך יכול לדרוש חישוב סכום של )‪ O(n‬איברים )‪ (2‬כיוון שכל עובד מופיע‬
‫רק בשני סכומים )בחישוב הערכים של אבא שלו(‪ ,‬סך החישובים לכל הסכומים‬
‫הוא )‪ .O(n‬סך הכל‪ .O(n) :‬סידור מילים בשורה‪ :‬נתונים ‪ n‬מילים שאורכן‬
‫‪ . l1 , ..., ln‬שורה מכילה ‪ m‬תווים‪ .‬בין המילים יש בדיוק רווח אחד‬
‫)ייתכן רווח גדול יותר בסוף שורה(‪ si .‬־ מס' הרווחים בסוף השורה ה ‪.i‬‬
‫‪Pk−1 2‬‬
‫= ‪ .ugliness‬תארו אלג'‬
‫עבור סידור המילים ב ‪ k‬שורות‪i=1 si :‬‬
‫שמוצא סידור של מילים בשורות אשר מביא את הכיעור למינ'‪ .‬תתי בעיות‪:‬‬
‫)*( נגדיר את מס' הרווחים בסוף שורה שמתחיל במילה ה ‪ i‬ומסתיימת ב‬
‫‪Pj‬‬
‫‪ j − i) s(i, j) = m −‬הם הרווחים(‬
‫‪l − (j − i) :j‬‬
‫‪k=i k‬‬
‫)*( נגדיר עלות שורה שמתחילה במילה ‪ i‬ומסתיימת ב ‪) lc(i, j) :j‬מקבל‬
‫∞אם ‪ 0 ,(si, j) < 0‬אם ‪) j = n‬שורה אחרונה( ו ‪ s(i, j)2‬אחרת(‬
‫)*( נגדיר ]‪ c[j‬־ הכיעור המינ' לפסקה שמורכבת מ ‪ j‬המילים הראשונות‪.‬‬
‫הקשר לפתרון‪ :‬רוצים למצוא את ]‪ c[n‬בסיס‪ .c[1] = lc(1, 1) :‬חישוב‪:‬‬
‫})‪ .c[j] = min1≤i≤j {c[i − 1] + lc(i, j‬סיבוכיות‪ (1) :‬מחשבים ‪n‬‬
‫ ‬
‫ערכים של ]‪ .c[j‬לצורך זה נצטרך ‪ O n2‬ערכים של )‪ lc(i, j‬ו )‪(2) s(i, j‬‬
‫חישוב ערך של )‪ s(i, j‬לוקח זמן קבוע אם משתמשים בערך של )‪s(i, j − 1‬‬
‫‪ lc(i,‬בזמן קבוע )‪ (4‬כלומר חישוב של ]‪ c[j‬לוקח )‪ O(n‬זמן‬
‫)‪ (3‬חישוב )‪j‬‬
‫ ‬
‫‪ m‬מילים‪.‬‬
‫‪ .O n2‬שיפור‪ :‬שורה יכולה להכיל לכל היותר‬
‫)‪ (5‬סה"כ‪:‬‬
‫‪2‬‬
‫‪m‬‬
‫לכן‪ (*) :‬אפשר להניח שמתקיים ∞ = )‪ lc(i, j‬כאשר ‪j − i > 2‬‬
‫)*( נצטרך לחשב רק )‪ O(nm‬ערכי )‪ (*) lc(i, j‬נשנה את ההגדרה של‬
‫]‪ c[j‬להיות })‪ (*) c[j] = minj− m ≤i≤j {c[i − 1] + lc(i, j‬חישוב‬
‫‪2‬‬
‫של ]‪ c[j‬יעלה )‪ (*) O(m‬סה"כ סיבוכיות‪ .O(mn) :‬רשתות זרימה‪:‬‬
‫מס' מקורות ובורות‪ :‬נתונה ר"ז עם מס' מקורות ומס' בורות‪ .‬הראו שניתן למצוא‬
‫זרימה מקס' ע"י שימוש באלג' לבעיה המקורית‪ .‬פתרון‪ :‬נוסיף "מקור על" וממנו‬
‫קשתות לשאר המקורות עם קיבול אינסופי‪ ,‬ו"בור על" עם קשתות אליו משאר‬
‫הבורות עם קיבול אינסופי‪ .‬זרימה בשלמים‪ :‬נתונה ר"ז עם קיבולים שלמים‪ .‬הוכח‬
‫שערך הזרימה המקס' שלם‪ .‬פתרון‪ :‬כל הקיבולים ברשת שלמים ⇐ הערך של כל‬
‫‪M axF low\M inCut‬‬
‫⇐‬
‫חתך ברשת שלם ⇐ הערך של החתך המינימלי שלם‬
‫ערך הזרימה המקסימלית שלם‪ .‬זרימה בשלמים ‪ :2‬רוצים להראות שהשיטה של‬
‫‪ F F‬מוצאת זרימה מקסימלית ‪ f‬כך שלכל ‪ f (u, v) ,u, v ∈ V‬שלם‪ .‬פתרון‪:‬‬
‫נוכיח באינדוקציה על מס' הזרימות שהאלג' חיבר עד כה‪ .‬בסיס‪ :‬מצאנו ‪0‬‬
‫מסלולים‪ ,‬אז לכל קשת יש זרימה ‪ .0‬צעד‪ :‬מצאנו זרימה ‪ f‬שבה בכל קשת‬
‫עוברת זרימה שלמה‪ .‬יהי ‪ p‬מסלול ברשת השיורית של ‪ (1) .f‬מההנחה‪ ,‬כל‬
‫הקיבולים ברשת השיורית שלמים‪ (2) .‬גודל הזרימה שנעביר דרך ‪ p‬הנו הקיבול‬
‫המינימלי מקיבולי קשתות ‪ ,p‬ולכן מדובר בערך שלם‪ .‬מסלולים זרים בקשתות‬
‫‪ +‬קשתות מנתקות‪ :‬נתון גרף מכוון וצמתים ‪ .s, t‬מס' מקס' של מסלולים‬
‫זרים בקשתות מ ‪ s‬ל ‪ t‬שווה למס' מינ' של קשתות שיש לנתק ע"מ שלא יהיה‬
‫מסלול מ ‪ s‬ל ‪ .t‬פתרון )לשתי הבעיות(‪ :‬ניתן לכל קשת קיבול ‪) 1‬מקבלים‬
‫ מקסימליתמ ‪ s‬ל ‪) t‬שווה בערכה למס' הרצוי(‪.‬‬
‫ ונמצא זרימה‬
‫רשת ‪,(0 − 1‬‬
‫‪1‬‬
‫סיבוכיות‪:‬‬
‫‪2‬‬
‫‪n3 ,m2‬‬
‫‪m · min‬‬
‫‪ .O‬מסלולים זרים בקדקודים‪ :‬נתון‬
‫גרף מכוון וצמתים ‪ .s, v‬תארו אלג' אשר מוצא את המס' המקס' של מסלולים‬
‫זרים בקדקודים מ ‪ s‬ל ‪ .t‬פתרון‪ :‬ניתן לכל קשת קיבול ‪ .1‬בנוסף‪ ,‬נפצל כל קדקוד‬
‫‪) v‬פרט ל ‪ s‬ו ‪ (t‬לשני קדקודים ‪ ,vin , vout‬עם קשת מ ‪vin‬ל ‪ vout‬בקיבול ‪.1‬‬
‫אמ"מ הם זריםבקדקודים‪ .‬נמצא את‬
‫זרים בקשתות ‬
‫ברשת שהתקבלה‪ ,‬מסלולים ‬
‫‪2‬‬
‫‪1‬‬
‫‪ .O m · min n 3 , m 2‬זיווג מקסימום‪:‬‬
‫הזרימה המקסימלית בזמן‬
‫נתון גרף דו"צ )‪ .G = (U, W, E‬תארו אלג' המוצא זיווג מקסימום בגרף‪.‬‬
‫פתרון‪ :‬נהפוך את ‪ G‬לר"ז‪ (1) :‬נכוון את כל הקשתות מ ‪ U‬ל ‪ (2) W‬נוסיף קדקוד‬
‫‪ s‬וניצור ממנו קשתות לכל קדקודי ‪ (3) U‬נוסיף קדקוד ‪ t‬וניצור קשתות אליו‬
‫מכל קדקודי ‪ (4) W‬ניתן לכל הקשתות קיבול ‪ .1‬קיבלנו ר"ז ‪1‬־‪ .0‬נמצא זרימה‬
‫מקסימלית מ ‪ s‬ל ‪ .t‬גודל הזרימה המקסימלית שווה לגודל הזיווג המקסימום‪,‬‬
‫וקבוצת הקשתות הרוויות מ ‪ U‬ל ‪ W‬הנה זיווג מקסימום‪ .‬סיבוכיות‪ :‬בניית הרשת‬
‫ √‬
‫־ זמן לינארי‪ .‬מציאת הזרימה ־ דיניץ ב ‪ .O m · n‬מכונות ומשימות‪:‬‬
‫נתונות ‪ n‬מכונות ו ‪ m‬משימות‪ .‬מכונה ‪ i‬יכולה לבצע ‪ ni‬משימות‪ .‬לכל‬
‫משימה נתונה רשימת המכונות שיודעות לבצע אותה‪ .‬תאר אלג' אשר בוחר לכל‬
‫משימה את המכונה שתבצע אותה‪ ,‬או מודיע שלא קיימת השמה כזה‪ .‬פתרון‪:‬‬
‫נהפוך את הבעיה לבעיה בזרימה‪ (1) :‬ניצור גרף דו"צ‪ ,‬שבו קבוצת קדקודים אחת‬
‫היא המשימות‪ ,‬והשנייה היא המכונות )‪ (2‬נעביר קשתות בקיבול ‪ 1‬מכל משימה‬
‫למכונות שיודעות לבצע אותה )‪ (3‬ניצור קדקוד ‪ s‬וממנו קשתות בקיבול ‪ 1‬לכל‬
‫‪ m‬המשימות )‪ (4‬ניצור קדקוד ‪ t‬ואליו קשתות בקיבול ‪ ni‬עבור כל מכונה ‪.i‬‬
‫כעת נחפש זרימה בגודל ‪ .m‬סיבוכיות‪ :‬מס' הקדקודים ־ ‪ .m + n + 2‬מס'‬
‫הקשתות שלהמשימות(‪ .‬דיניץ ירוץ‬
‫אורכי‬
‫‬
‫‬
‫הקשתות ־ ‪ M ) m + n + M‬־ סך ‬
‫ב‪ ,O mn2 = O (m + n + M ) · (m + n)2 :‬אבל ‪ F F‬חסום‬
‫ע"י‪ k .O (m (m + n + M )) :‬קשירות‪ :‬גרף מכוון נקרא ‪k‬־קשיר אם בין‬
‫כל זוג קדקודים שלו יש לפחות ‪ k‬מסלולים זרים בקשתות )בכל כיוון(‪ .‬נתון גרף‬
‫מכוון ‪ G‬וקבוע ‪ .k‬תארו אלג' אשר בודק האם ‪ G‬הוא ‪k‬־קשיר‪ .‬פתרון‪ :‬עבור‬
‫כל זוג קדקודים ‪ v, u ∈ V‬נבדוק האם יש בינם ‪ k‬מסלולים זרים בקשתות‬
‫‪2‬‬
‫)לכל זוג קדקודים( ברשת ‪.0 − 1‬‬
‫)בשני‬
‫דיניץ ‪ n‬פעמים ‬
‫הכיוונים(‪ .‬מריצים ‬
‫‬
‫‪1‬‬
‫סיבוכיות‪:‬‬
‫‪2‬‬
‫‪n3 ,m2‬‬
‫‪n2 m · min‬‬
‫‪ .O‬שיפור ‪ :1‬אין צורך למצוא‬
‫מספיק להריץ ‪ F F‬ולעצור אחרי ‪ k‬מסלולים משפרים‪ .‬סיבוכיות‪:‬‬
‫זרימה מקס'‪ ,‬‬
‫‬
‫‪ .O n2 · m · k‬שיפור ‪ :2‬נבחר קדקוד כלשהו ‪ v ∈ V‬ונבדוק שיש ‪k‬‬
‫מסלולים זרים בקשתות בינו לבין כל אחד מהקדקודים האחרים )בשני הכיוונים(‪.‬‬
‫סיבוכיות‪ .O (n · m · k) :‬מציאת חתך מינ'‪ :‬נתונה ר"ז וזרימה מקס' ‪ .f‬תארו‬
‫אלג' למציאת חתך מינ'‪ .‬פתרון‪ :‬נבנה את הרשת השיורית ביחס ל ‪ .f‬נריץ ‪BF S‬‬
‫מהמקור ונכניס את כל הקדקודים שבעץ ה ‪ BF S‬לתוך ‪ .S‬שאר הקדקודים‬
‫יהיו ב ‪ .T‬סיבוכיות‪ .O(m + n) :‬כיסוי לוח שחמט עם אבני דומינו‪ :‬נתון‬
‫לוח שח בגודל ‪ ,n × n‬לאחר שהוסרו ממנו חלק מהמשבצות‪ .‬תארו אלג'‬
‫שבודק האם ניתן לכסות אותו ע"י אבני דומינו‪ .‬פתרון‪ :‬נבנה גרף‪ (*) :‬ניצור‬
‫קדקוד לכל משבצת )*( ניצור קשת לכל זוג משבצות סמוכות‪ .‬זהו גרף דו"צ‬
‫־ צד לקדקודים של המשבצות השחורות‪ ,‬וצד ללבנות‪ .‬קיים כיסוי חוקי של‬
‫אבני דומינו אמ"מ קיים זיווג מושלם בגרף‪ .‬ע"מ למצוא זיווג מקס' בגרף דו‬
‫צדדי בונים רשת מטיפוס ‪) 2‬רשת שבה לכל קדקוד )פרט ל ‪ s‬ו ‪ (t‬יש או קשת‬
‫יציאה יחידה בקיבול ‪ ,1‬שאר הקיבולים הם‬
‫קשת ‬
‫כניסה יחידה בקיבול ‪ ,1‬או ‬
‫ √‬
‫שלמים אקראיים(‪ .‬סיבוכיות‪) O m n = O n2 :‬יש )‪ O(n‬קשתות‬
‫ ‬
‫לכל היותר ־ מכל קדקוד יש עד ‪ 4‬קשתות‪ ,‬ומס' הקדקודים הוא ‪.(O n2‬‬
‫משפט ‪ :Hall‬עבור גרף דו"צ לא מכוון )‪ G(U, W, E‬ותת קבוצה ‪X ⊆ U‬‬
‫נגדיר‪ .N (X) = {y ∈ W : (x, y) ∈ E for some x ∈ X} :‬נתון‬
‫גרף דו"צ )‪ G = (U, W, E‬כך ש ‪ .|U | = |W | = n‬צ"ל‪ :‬קיים זיווג‬
‫מושלם בגרף אמ"מ לכל תת קבוצה ‪ X ⊆ U‬מתקיים |)‪.|X| ≤ |N (X‬‬
‫כיוון ראשון‪ (*) :‬נניח שקיים זיווג מושלם בגרף )*( נבחר זיווג מושלם‪ ,‬ונסמן ב‬
‫‪ Y ⊆ W‬את קבוצת הקדקודים שמתאימים בזיווג לקדקודים ‪ (*) X‬מתקיים‬
‫| ‪ |X| = |Y‬וגם )‪ ,Y ⊆ N (X‬לכן |)‪ .|X| = |Y | ≤ |N (X‬כיוון‬
‫שני‪ (*) :‬נניח שלכל תת קבוצה ‪ X ⊆ U‬מתקיים |)‪(*) |X| ≤ |N (X‬‬
‫נהפוך את הגרף לר"ז‪ ,‬אך לקשתות מ ‪ U‬ל ‪ W‬ניתן קיבול אינסופי )*( גודל‬
‫הזרימה המקס' שווה לגודל הזיווג המקס' )*( נניח בשלילה שלא קיים זיווג מושלם‪.‬‬
‫נסמן את גודל הזיווג המקס' ב ‪ .k < |W | = |U | = n‬ז"א שקיים‬
‫חתך ‪ S, T‬בגודל ‪ (*) k‬נסמן‪) :‬א( ‪) A = S ∩ U‬ב( ‪B = T ∩ U‬‬
‫)ג( ‪) C = S ∩ W‬ד( ‪ (*) D = T ∩ W‬לא תיתכן קשת מ ‪ A‬ל ‪,D‬‬
‫כיוון שאז לחתך יהיה ערך אינסופי‪ .‬כלומר ‪ (*) N (A) ⊆ C‬לכן‪ ,‬בחתך יש‬
‫רק קשתות מ ‪ s‬ל ‪ B‬ומ ‪ C‬ל ‪ .t‬כלומר ‪ (*) .|B| + |C| = k‬נקבל‬
‫סתירה להנחה‪.|N (A)| ≤ |C| = k − |B| < |U | − |B| = |A| :‬‬
‫תת גרף עם דרגות ‪ :1‬נתון גרף מכוון ‪ .G‬תארו אלג' המוצא קבוצת קשתות‬
‫‪ ,E 0 ⊆ E‬כך שלכל קדקוד בגרף ) ‪ G0 = (V, E 0‬דרגת כניסה ‪ 1‬ודרגת יציאה‬
‫‪) 1‬או מודיע שלא קיימת(‪ .‬פתרון‪ (*) :‬נבנה גרף דו"צ ) ∗ ‪ G = (U, W, E‬כך‬
‫ש ‪ .U = W = V‬נסמן } ‪ W = {w1 , ..., wn‬ו } ‪U = {u1 , ..., un‬‬
‫‬
‫‬
‫)*( לכל קשת ‪ vi , vj ∈ E‬ניצור קשת ∗ ‪ (*) ui , wj ∈ E‬נבדוק האם‬
‫קיים בגרף זיווג מושלם )ע"י מציאת זיווג מקס'( )*( אם מצאנו זיווג מושלם‪ ,‬נחזיר‬
‫את קבוצת הקשתות בגרף המקורי אשר מתאימות לקשתות הזיווג )*( אחרת‪,‬‬
‫נודיע שלא קיים תת גרף מתאים‪ .‬אילוצי דרגות‪ :‬נתון גרף לא מכוון ‪ .G‬תארו‬
‫אלג' אשר מכוון את קשתות הגרף‪ ,‬כך שבגרף שהתקבל לכל קדקוד תהיה דרגת‬
‫יציאה ≥ ‪) 3‬או מודיע שלא קיים כיוון כזה(‪ .‬פתרון‪ :‬נבנה גרף דו"צ‪ ,‬וממנו נבנה‬
‫ר"ז‪ (1) :‬נוסיף קדקוד עבור כל קדקוד של הגרף המקורי ) ‪ (2) (U‬קדקוד עבור‬
‫כל קשת של הגרף המקורי ) ‪ (3) (W‬נעביר קשתות מכל קדקוד ב ‪ U‬לקדקוד ב‬
‫‪ ,W‬אם בגרף המקורי הקדקוד שב ‪ U‬סמוך לקשת שב ‪ .W‬ניתן קיבול ‪ 1‬לכל‬
‫קשת כזו )‪ (4‬נוסיף קדקוד ‪ ,s‬ונעביר ממנו קשתות בקיבול ‪) 3‬דרגת היציאה( לכל‬
‫קדקוד ב ‪ (5) U‬נוסיף קדקוד ‪ ,t‬ונעביר אליו קשתות בקיבול ‪ 1‬מכל קדקוד ב ‪.W‬‬
‫קיים כיוון תקין של הגרף אמ"מ גודל הזרימה המקסימלית הנו |‪ .|E‬סיבוכיות‪:‬‬
‫גודל הרשת‪ :‬קדקודים‪ ,|V 0 | = O(m+n) :‬קשתות‪.|E 0 | = O(m+n) :‬‬
‫‬
‫‬
‫זמן ריצה‪ :‬הרצת דיניץ )לא ‪1‬־‪ (0‬־ | ‪ ,O |V 0 |2 · |E 0‬כיוון הקשתות בהתאם‬
‫לזרימה ־ )‪ ,O(m‬הרצת ‪ F F‬־ ))‪ .O (m(m + n‬שיפור‪ :‬נרצה לקבל רשת‬
‫‪ .0 − 1‬נפרק כל קדקוד ל־‪ 3‬קדקודים בצד השמאלישל הרשת‪ .‬ניתןלכל‬
‫‪p‬‬
‫הקשתות מהמקור לקדקודים הללו קיבול ‪ .1‬זמן ריצה‪O |E 0 | · |V 0 | :‬‬
‫תכנות לינארי‪ :‬פריאמלי‪+‬דואלית‪ :‬רוצים לתת משקל ≤ ‪ 0‬לכל הקשתות‪ ,‬כך‬
‫שסכום המשקלים יהיה מקס'‪ .‬לכל קדקוד סכום משקלי הקשתות הסמוכות ≥ ‪.1‬‬
‫‪P‬‬
‫פתרון‪ :‬לכל ‪ e ∈ E‬ניצור ‪ ,xe‬ונרצה למצוא ‪ .max e∈E xe‬לכל ‪v ∈ V‬‬
‫‪P‬‬
‫ניצור אילוץ ‪) v∈e xe ≤ 1‬סכום על הקשתות שמכילות את הקדקוד(‪ .‬נוסיף‬
‫אילוצי חיוביות‪ .‬יש משתנה לכל קשת ואילוץ לכל קדקוד‪ .‬התכנית הדואלית‪:‬‬
‫‪P‬‬
‫| ‪P|V‬‬
‫ל ‪ yv ≥ 0 ,e ∈ E‬ל ‪.v ∈ V‬‬
‫‪v∈e yv ≥ 1 ,min‬‬
‫‪v=1 yv‬‬
‫יש משתנה לכל קדקוד ואילוץ לכל קשת‪ .‬התכנית הדואלית פותרת את הבעיה‪:‬‬
‫רוצים לתת משקל ≤ ‪ 0‬לכל קדקוד‪ ,‬כך שסכום משקלי הקדקודים מינ'‪ .‬עבור‬
‫כל קשת‪ ,‬סכום משקלי הקדקודים שהיא נוגעת בהם נדרוש להיות לפחות ‪.1‬‬
‫פיזיביליות לינארית ) ‪ (1) :(LF‬נתון אלג' לפתרון ‪ .LP‬כיצד פותרים בעזרתו‬
‫בעיית ‪ ?LF‬פתרון‪ :‬נוסיף פ' מטרה כלשהי )למשל ‪ (min 0‬ונקבל בעיית ‪.LP‬‬
‫)‪ (2‬נתון אלג' לפתרון ‪ .LF‬כיצד פותרים בעזרתו בעיית ‪ ?LP‬נשתמש באילוצים‬
‫‪P‬‬
‫‪Pm‬‬
‫‪. n‬‬
‫= ‪j=1 cj xj‬‬
‫של הפרימאלית ושל הדואלית‪ .‬נוסיף אילוץ ‪i=1 bi yi‬‬
‫מתקיים רק עבור הפתרונות האופ'‪.‬‬