You are on page 1of 59

‫אלגוריתמים ־ סיכום הרצאות‬

‫פרופ' רון שמיר‪ 2017 ,‬סמסטר ב'‬


‫‪ 30‬ביוני ‪2019‬‬

‫תוכן עניינים‬
‫‪4‬‬ ‫הקדמה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪1‬‬
‫‪4‬‬ ‫הקדמה כללית ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪1.1‬‬
‫‪4‬‬ ‫גרפים ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪1.2‬‬
‫‪4‬‬ ‫טרמינולוגיה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪1.2.1‬‬
‫‪4‬‬ ‫הצגות של גרפים ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪1.3‬‬
‫‪4‬‬ ‫רשימת שכנויות )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (b‬‬ ‫‪1.3.1‬‬
‫‪5‬‬ ‫מטריצת שכנויות )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (c‬‬ ‫‪1.3.2‬‬
‫‪6‬‬ ‫אלגוריתם ‪ (Breadth First Search) BFS‬־ פרק ‪ 22‬בספר ‪. . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪2‬‬
‫‪6‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪2.1‬‬
‫‪6‬‬ ‫מבנה הנתונים שנשתמש בו ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪2.2‬‬
‫‪6‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪2.3‬‬
‫‪7‬‬ ‫תיאור ריצת האלגוריתם עבור גרף לדוגמה‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . :‬‬ ‫‪2.3.1‬‬
‫‪7‬‬ ‫סיבוכיות זמן ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪2.3.2‬‬
‫‪7‬‬ ‫הוכחת נכונות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪2.4‬‬
‫‪9‬‬ ‫עץ ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BF‬‬ ‫‪2.5‬‬
‫‪10‬‬ ‫אלגוריתם ‪ (Depth First Search) DFS‬־ פרק ‪ 22‬בספר ‪. . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪3‬‬
‫‪10‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪3.1‬‬
‫‪10‬‬ ‫מבנה הנתונים שנשתמש בו ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪3.2‬‬
‫‪10‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪3.3‬‬
‫‪11‬‬ ‫תיאור ריצת האלגוריתם עבור גרף לדוגמה‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . :‬‬ ‫‪3.3.1‬‬
‫‪11‬‬ ‫סיבוכיות זמן ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪3.3.2‬‬
‫‪11‬‬ ‫יער ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DF‬‬ ‫‪3.4‬‬
‫‪14‬‬ ‫מיון טופולוגי )בגרף מכוון חסר מעגלים ־ ‪ (DAG‬־ פרק ‪ 22‬בספר ‪. . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪4‬‬
‫‪14‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪4.1‬‬
‫‪14‬‬ ‫מבנה הנתונים שנשתמש בו ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪4.2‬‬
‫‪14‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪4.3‬‬
‫‪15‬‬ ‫הוכחת נכונות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪4.4‬‬
‫‪16‬‬ ‫פירוק לרכיבי קשירות חזקה )ּ‪. . . . . . . . . . . . . . . . . . . . . . . . (Strongly Connected Components‬‬ ‫‪5‬‬
‫‪16‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪5.1‬‬
‫‪17‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪5.2‬‬
‫‪17‬‬ ‫הוכחת נכונות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪5.3‬‬
‫‪18‬‬ ‫עצים פורשים מינימליים )‪ (Minimum Spanning Trees‬־ פרק ‪ 23‬בספר ‪. . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6‬‬
‫‪18‬‬ ‫האלגוריתם הגנרי )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (Generic MST‬‬ ‫‪6.1‬‬
‫‪18‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6.1.1‬‬
‫‪18‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6.1.2‬‬
‫‪18‬‬ ‫הוכחת נכונות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6.1.3‬‬
‫‪20‬‬ ‫האלגוריתם של קרוסקל )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (MST-Kruskal‬‬ ‫‪6.2‬‬
‫‪20‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6.2.1‬‬
‫‪20‬‬ ‫מבנה הנתונים שנשתמש בו ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6.2.2‬‬
‫‪20‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6.2.3‬‬
‫‪21‬‬ ‫דוגמת הרצה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6.2.4‬‬
‫‪21‬‬ ‫ניתוח סיבוכיות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪6.2.5‬‬
‫‪22‬‬ ‫האלגוריתם של פרים )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (MST-Prim‬‬ ‫‪6.3‬‬

‫‪1‬‬
‫‪22‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫תיאור אבסטרקטי של האלגוריתם ‪. . .‬‬‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫‪6.3.1‬‬‫‪.‬‬
‫‪22‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫מבנה הנתונים שנשתמש בו ‪. . . . . . .‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫‪6.3.2‬‬‫‪.‬‬
‫‪22‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫האלגוריתם ‪. . . . . . . . . . . . . . .‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫‪6.3.3‬‬‫‪.‬‬
‫‪23‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫דוגמת הרצה ‪. . . . . . . . . . . . . .‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫‪6.3.4‬‬‫‪.‬‬
‫‪23‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫ניתוח סיבוכיות ‪. . . . . . . . . . . . .‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬
‫‪6.3.5‬‬‫‪.‬‬
‫‪24‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫תכנון דינאמי )‪ (Dynamic Programming‬־ פרק ‪ 15‬בספר‬
‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪7‬‬
‫‪24‬‬ ‫הקדמה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪7.1‬‬
‫‪24‬‬ ‫דוגמה ‪ 1‬־ תכנון פס ייצור ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪7.2‬‬
‫‪26‬‬ ‫דוגמה ‪ 2‬־ כפל סדרת מטריצות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪7.3‬‬
‫‪28‬‬ ‫דוגמה ‪ 3‬־ ‪ Sequence Alignment‬־ עימוד סדרות ‪ /‬רצפים )פרק ‪ 6‬ב־‪ Algorithm Design‬של ‪. . . (KT‬‬ ‫‪7.4‬‬
‫‪30‬‬ ‫סיכום ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪7.5‬‬
‫‪32‬‬ ‫מסלולים קצרים ביותר ממקור יחיד )‪ (Single-Source Shortest Paths‬־ פרק ‪ 24‬בספר ‪. . . . . . . . . . . . . .‬‬ ‫‪8‬‬
‫‪32‬‬ ‫הקדמה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.1‬‬
‫‪33‬‬ ‫טכניקת ההקלה )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (Relaxation‬‬ ‫‪8.2‬‬
‫‪34‬‬ ‫טענות עזר ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.3‬‬
‫‪35‬‬ ‫אלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bellman-Ford‬‬ ‫‪8.4‬‬
‫‪35‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.4.1‬‬
‫‪35‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.4.2‬‬
‫‪35‬‬ ‫דוגמת הרצה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.4.3‬‬
‫‪36‬‬ ‫ניתוח סיבוכיות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.4.4‬‬
‫‪36‬‬ ‫הוכחת נכונות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.4.5‬‬
‫‪36‬‬ ‫מק”בים ממקור יחיד בגרף מכוון חסר מעגלים )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . (DAG‬‬ ‫‪8.5‬‬
‫‪36‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.5.1‬‬
‫‪37‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.5.2‬‬
‫‪37‬‬ ‫דוגמת הרצה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.5.3‬‬
‫‪37‬‬ ‫אלגוריתם ‪) Dijkstra‬דייקסטרה( ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.6‬‬
‫‪37‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.6.1‬‬
‫‪38‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.6.2‬‬
‫‪38‬‬ ‫דוגמת הרצה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.6.3‬‬
‫‪38‬‬ ‫ניתוח סיבוכיות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪8.6.4‬‬
‫‪40‬‬ ‫אילוצי הפרשים ומסלולים קצרים ביותר )‪ (Dierence Constraints and Shortest Paths‬־ המשך פרק ‪ 24‬בספר‬ ‫‪9‬‬
‫‪40‬‬ ‫הקדמה ־ תכנון לינארי )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (Linear Programming‬‬ ‫‪9.1‬‬
‫‪40‬‬ ‫מערכות של הפרשי אילוצים )‪. . . . . . . . . . . . . . . . . . . . (Systems of Dierence Consraints‬‬ ‫‪9.2‬‬
‫‪41‬‬ ‫פתרון מערכות של הפרשי אילוצים ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪9.2.1‬‬
‫‪41‬‬ ‫מסלולים קצרים ביותר בין כל הזוגות )‪ (All Pairs Shortest Paths‬־ פרק ‪ 25‬בספר ‪. . . . . . . . . . . . . . . .‬‬ ‫‪10‬‬
‫‪41‬‬ ‫הקדמה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.1‬‬
‫‪42‬‬ ‫מסלולים קצרים ביותר וכפל מטריצות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.2‬‬
‫‪42‬‬ ‫האלגוריתם )וניתוח סיבוכיות( ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.2.1‬‬
‫‪43‬‬ ‫אלגוריתם פלויד־וורשאל )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (Floyd-Warshall‬‬ ‫‪10.3‬‬
‫‪44‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.3.1‬‬
‫‪44‬‬ ‫ניתוח סיבוכיות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.3.2‬‬
‫‪44‬‬ ‫האלגוריתם של ג'ונסון עבור גרפים דלילים )‪. . . . . . . . . (Johnson's Algorithm for Sparse Graphs‬‬ ‫‪10.4‬‬
‫‪44‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.4.1‬‬
‫‪45‬‬ ‫האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.4.2‬‬
‫‪45‬‬ ‫דוגמת הרצה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.4.3‬‬
‫‪45‬‬ ‫ניתוח סיבוכיות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪10.4.4‬‬
‫‪47‬‬ ‫זרימה מקסימלית ורשתות זרימה )‪ (Maximum Flow and Flow Networks‬־ פרק ‪ 26‬בספר ‪. . . . . . . . . . .‬‬ ‫‪11‬‬
‫‪47‬‬ ‫הקדמה ־ רשתות זרימה וזרימות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.1‬‬
‫‪49‬‬ ‫שיטת פורד־פולקרסון )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . (The Ford-Fulkerson Method‬‬ ‫‪11.2‬‬
‫‪49‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.2.1‬‬
‫‪49‬‬ ‫האלגוריתם הבסיסי ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.2.2‬‬
‫‪50‬‬ ‫הוכחת נכונות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.2.3‬‬
‫‪54‬‬ ‫דוגמת הרצה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.2.4‬‬
‫‪54‬‬ ‫ניתוח סיבוכיות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.2.5‬‬
‫‪54‬‬ ‫אלגוריתם אדמונדס־קארפ )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (Edmonds-Karp‬‬ ‫‪11.3‬‬
‫‪54‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.3.1‬‬

‫‪2‬‬
‫‪55‬‬ ‫ניתוח סיבוכיות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.3.2‬‬
‫‪56‬‬ ‫האלגוריתם של דיניץ )‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (Dinic‬‬ ‫‪11.4‬‬
‫‪56‬‬ ‫הקדמה ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.4.1‬‬
‫‪57‬‬ ‫תיאור אבסטרקטי של האלגוריתם ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.4.2‬‬
‫‪57‬‬ ‫הוכחת נכונות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.4.3‬‬
‫‪57‬‬ ‫ניתוח סיבוכיות ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬ ‫‪11.4.4‬‬
‫‪59‬‬ ‫צימוד )זיווג( בגרפים לא מכוונים )‪ (Maximum Matching in Bipartite Graphs‬־ המשך פרק ‪ 26‬בספר ‪. . . . .‬‬ ‫‪12‬‬

‫‪3‬‬
‫הקדמה‬ ‫‪1‬‬
‫הקדמה כללית‬ ‫‪1.1‬‬
‫‪• http://tau-algorithms.wikidot.com‬‬
‫‪• Introduction to Algorithms, by T. Cormen, C. Leiserson, R. Rivest, and C. Stein. Third edition, MIT Press,‬‬
‫‪2009.‬‬
‫‪• Algorithm Design, by J. Kleinberg and E. Tardos. Pearson/Addison Wesley, 2006.‬‬

‫• ‪ 6‬תרגילים ככל הנראה שמהווים ‪ 10%‬מהציון‪ .‬אין חובת הגשה על שיעורי בית )זה פשוט ישוקלל כ־‪ 0‬בציון(‪.‬‬

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

‫טרמינולוגיה‬ ‫‪1.2.1‬‬
‫)‪G = (V, E‬‬ ‫גרף‬

‫‪(u, v) = e ∈ E‬‬ ‫קשת‬


‫סדרה של קשתות עוקבות‬ ‫מסלול‬
‫מסלול פשוט ללא צמתים חוזרים‬
‫אורך מסלול מספר קשתות‬

‫הצגות של גרפים‬ ‫‪1.3‬‬


‫שתי הצגות קנוניות לגרף )‪:(a‬‬

‫רשימת שכנויות )‪(b‬‬ ‫‪1.3.1‬‬


‫מערך של | ‪ |V‬רשימות‪ ,‬לכל ‪ Adj(u) ,u ∈ V‬רשימת שכנויות של ‪) u‬הסדר ברשימת השכנויות שרירותי(‪.‬‬
‫• זכרון‪ ,O(V + E) :‬כל קשת תופיע פעמיים בייצוג הזה ולכן )‪ O(E‬מחיר הקשתות‪ ,‬ומוסיפים את ‪ V‬כי ייתכן שיש צמתים‬
‫מבודדים‪.‬‬

‫• לגרף ממושקל‪ :‬נשמור משקולות בתוך גרף השכנויות )בתא נוסף למשל(‬
‫• האם קשת )‪ (u, v‬בגרף? ) ‪ O(V‬זמן )סריקת )‪ ,Adj(u‬ובדיקה האם ‪ v‬מופיע ברשימה(‬

‫‪4‬‬
‫מטריצת שכנויות )‪(c‬‬ ‫‪1.3.2‬‬
‫‪ ,|V | = n‬מטריצת ‪.n × n‬‬
‫(‬
‫‪1 (i, j) ∈ E‬‬
‫= ‪aij‬‬
‫‪0 else‬‬

‫• זכרון‪) O(V 2 ) :‬יכול להיות משמעותית יותר מהייצוג הקודם אם הגרף דליל(‬
‫• לגרף ממושקל‪ :‬נשמור ‪aij = wij‬‬
‫• האם קשת )‪ (u, v‬בגרף? )‪ O(1‬זמן )גישה ישירה לתא הרלוונטי(‬
‫• הערות‪:‬‬

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


‫– יתרון מסויים לייצוג הזה הוא שניתן לשמור כל ערך במטריצה בביט בודד‪ ,‬ולכן למעשה ניתן לשמור ‪ 64‬תאים של‬
‫המטריצה במילת מחשב של ‪ 8‬בתים‪.‬‬

‫‪5‬‬
‫אלגוריתם ‪ (Breadth First Search) BFS‬־ פרק ‪ 22‬בספר‬ ‫‪2‬‬
‫בהנתן )‪ G = (V, E‬ומקור ‪:s ∈ V‬‬

‫‪ .1‬מצא כל צומת נגיש מ־‪) s‬כלומר קיים מסלול מ־‪ s‬אליו(‬


‫‪ .2‬חשב את מרחקו )מרחק = אורך המסלול הקצר ביותר מ־‪ s‬אליו(‪.‬‬
‫‪ .3‬בנה עץ ששורשו ‪ s‬המכיל בדיוק את כל הצמתים הנגישים ואם ‪ u‬נגיש מ־‪ s‬אזי המסלול מ־‪ s‬ל־‪ u‬ב־ ‪ T‬הוא באורך המרחק‬
‫בינהם‪.‬‬

‫הערה ‪ 2.1‬עץ = גרף קשיר חסר מעגלים‬

‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪2.1‬‬


‫מניחים שהקלט הוא רשימת שכנויות‪ .‬נתחיל עם צומת המקור )בהתחלה כל הצמתים לבנים(‪ .‬באופן איטרטיבי‪ :‬כל שכן של הצומת‬
‫הנוכחי שהוא לבן‪ ,‬יהפוך לאפור )”גילינו” אותו( וייכנס לתור לאיטרציות הבאות‪ .‬כמו כן נקבע לשכן מרחק לפי הצומת הנוכחי‪ ,‬וכן‬
‫נוסיף את הקשת מהצומת הנוכחי לשכן אל עץ ה־‪ .BF‬כשנסיים עם הצומת הנוכחי הוא יהפוך לשחור‪.‬‬

‫מבנה הנתונים שנשתמש בו‬ ‫‪2.2‬‬


‫הצבע של ‪u‬‬ ‫)‪color(u‬‬
‫האב של ‪ N IL) u‬אם אין(‬ ‫)‪π(u‬‬
‫המרחק הזמני מ־‪ s‬ל־‪u‬‬ ‫)‪d(u‬‬
‫תור ‪ FIFO‬של צמתים אפורים‬ ‫‪Q‬‬

‫האלגוריתם‬ ‫‪2.3‬‬

‫‪6‬‬
‫תיאור ריצת האלגוריתם עבור גרף לדוגמה‪:‬‬ ‫‪2.3.1‬‬

‫טענה ‪ 2.2‬הלולאה מקיימת את השמורה‪ :‬בשלב הבדיקה )שורה ‪ (10‬התור ‪ Q‬מכיל את כל הצמתים האפורים‬

‫הוכחה‪) :‬באינדוקציה(‪ .‬בהתחלה ‪ Q = s‬ו־‪ s‬היחיד האפור‪ .‬בכל מעבר על הלולאה שולפים מראש התור צומת אפור ‪) u‬שורה ‪.(11‬‬
‫עוברים על שכני ‪ ,u‬מכניסים כל שכן חדש ל־‪ Q‬וצובעים אותו באפור‪ .‬כשסיימנו לעבור על כל שכני ‪ ,u‬צובעים את ‪ u‬בשחור‪ .‬כלומר‪,‬‬
‫כשצומת הופך אפור הוא נכנס ל־‪ Q‬וכשיוצא מ־‪ Q‬הוא הופך שחור )מפסיק להיות אפור(‪ ,‬ולכן ‪ Q‬מכיל בדיוק את כל הצמתים‬
‫האפורים בגרף בכל רגע נתון‪.‬‬

‫סיבוכיות זמן‬ ‫‪2.3.2‬‬


‫הערה ‪ 2.3‬נסמן ‪ V, E‬במקום לסמן |‪ |V |, |E‬כשנדבר על סיבוכיות )בשביל לקצר‪ ,‬למרות שזה לא מדויק(‪.‬‬
‫לאחר האתחול שום צומת לא נצבע בלבן‪ ,‬ולכן הבדיקה שהצומת לבן )שורה ‪ (13‬מבטיחה שכל צומת מוכנס לתור לכל היותר פעם‬
‫אחת )ולכן גם יוצא מהתור לכל היותר פעם אחת(‪ .‬סך כל הפעולות בתור הן ) ‪ O(V‬כי הכנסה ‪ /‬הוצאה ב־‪ FIFO‬עולה )‪ .O(1‬רשימת‬
‫שכני ‪ u‬נסרקת פעם אחת לכל היותר )רק כאשר ‪ u‬נשלף מהתור(‪ .‬סכום אורכי הרשימות הוא )‪ .O(V + E‬כמו כן‪ ,‬האתחול עולה‬
‫) ‪ O(V‬כי בכל צומת עושים מספר קבוע של פעולות‪ .‬לכן סך הכל האלגוריתם נעשה ב־)‪.O(V + E‬‬

‫הוכחת נכונות‬ ‫‪2.4‬‬


‫הגדרה ‪ δ(s, v) 2.4‬המרחק הקצר ביותר מ־‪ s‬ל־‪v‬‬

‫)‪ δ(s, v‬הוא מספר הקשתות המינימלי במסלול כלשהו מ־‪ s‬ל־‪ .v‬נסמן ∞ = )‪ δ(s, v‬אם אין מסלול כזה‪.‬‬

‫למה ‪) 2.5‬למה ‪ (1‬בגרף לא מכוון )‪ G(V, E‬עבור צומת ‪ ,v ∈ V‬לכל קשת ‪ (v, u) ∈ E‬מתקיים ‪δ(s, v) ≤ δ(s, u) + 1‬‬
‫‪ s‬אז כיוון שקיימת הקשת‬ ‫הוכחה‪ :‬אם ‪ u‬נגיש מ־‪ s‬אז גם ‪ v‬נגיש מ־‪ s‬ולכן מתקיים ‪) δ(s, v) ≤ δ(s, u) + 1‬כלומר אם קיים ‪u‬‬
‫‪ s‬ואורכו גדול ב־‪ .(1‬לא ברור שזה המסלול הקצר ביותר אבל זה בטוח חסם עליון ע”י‬ ‫‪ ,u → v‬הרי שקיים גם מסלול ‪u → v‬‬
‫‪ s‬ואחריו הקשת )‪ ,(u, v‬ולכן מתקיים ‪ .δ(s, v) ≤ δ(s, u) + 1‬אם ‪ u‬לא נגיש מ־‪ s‬אז גם‬ ‫המק”ב )מק”ב = מסלול קצר ביותר( ‪u‬‬
‫‪ v‬לא נגיש מ־‪ s‬ואז מתקיים ∞ = )‪.δ(s, v) = δ(s, u‬‬

‫למה ‪) 2.6‬למה ‪ (2‬כשמריצים ‪ BFS‬על ‪ G‬ממקור ‪ s‬והאלגוריתם מסתיים‪ ,‬לכל ‪ v ∈ V‬מתקיים )‪.d(v) ≥ δ(s, v‬‬

‫‪7‬‬
‫הוכחה‪ :‬אינדוקציה על מספר פעולות ההכנסה ל־‪:Q‬‬
‫כשמתחילים‪ ,‬בהכנסה הראשונה ‪ d(s) = 0‬וגם ∞ = )‪ d(u‬לכל ‪0 = d(s) ≥ δ(s, s), ∞ = d(u) ≥ δ(s, u) .u 6= s‬‬ ‫בסיס‪:‬‬
‫כאשר צומת לבן ‪ v‬מתגלה )שורה ‪ (13‬בחיפוש מצומת ‪ u‬אז מהנחת האינדוקציה‪ ,‬מתקיים )‪ .d(u) ≥ δ(s, u‬לפי ההשמה‬ ‫צעד‪:‬‬
‫‪ .d(v) = d(u) + 1‬בשלב זה ‪ v‬מוכנס‬ ‫≥‬ ‫)שורה ‪ (15‬מתקיים‪ d(v) = d(u) + 1 :‬ולכן )‪δ(s, u) + 1 ≥ δ(s, v‬‬
‫}‪|{z‬‬ ‫}‪|{z‬‬
‫‪induction‬‬ ‫‪Lemma1‬‬
‫לתור‪ ,‬הוא אפור ולכן לא יכנס עוד לתור‪ d(v) .‬לא ישתנה עוד ־ הזמן היחיד ש־‪ d‬משתנה הוא כאשר צומת מתגלה‬
‫והופך מלבן לאפור )שורות ‪17‬־‪ 14‬מופעלות רק על צמתים לבנים(‪.‬‬

‫למה ‪) 2.7‬למה ‪ (3‬נניח שברגע מסויים בהרצת האלגוריתם‪ ,‬התור הוא ) ‪ ( v1 , ..., vr‬אזי מתקיים‪:‬‬
‫}‪|{z‬‬ ‫}‪|{z‬‬
‫‪head‬‬ ‫‪tail‬‬

‫‪ ,d(vr ) ≤ d(v1 ) + 1 .1‬מנעד ≥ ‪) 1‬מנעד = טווח‪ .(range ,‬כלומר‪ ,‬בכל שלב התור יכול להכיל את המרחקים ‪ 3334‬או ‪44555‬‬
‫אבל לא ייתכן שיכיל את המרחקים ‪.3345‬‬
‫‪ .2‬מונוטוניות‪∀i. d(vi ) ≤ d(vi+1 ) :‬‬
‫הוכחה‪ :‬אינדוקציה על מספר פעולות‪:‬‬
‫כשמתחילים התור מכיל רק את הצומת ‪ ,s‬ולכן ‪ 1‬ו־‪ 2‬מתקיימים באופן טריוויאלי‪.‬‬ ‫בסיס‪:‬‬
‫הוצאה ־ ‪ v1‬נשלף מהתור‪ v2 ,‬הופך לראש‪ .‬מהנחת האינדוקציה עבור ) ‪ ,d(v1‬מתקיים ) ‪) d(v1 ) ≤ d(v2‬מ־‪ ,(2‬וכן‬ ‫צעד‪:‬‬
‫‪) d(vr ) ≤ d(v1 ) + 1‬מ־‪ .(1‬סך הכל משני אי השיוויונות מקבלים כי ‪ d(vr ) ≤ d(v2 ) + 1‬וזה ‪ 1‬שרצינו להוכיח‪ .‬כמו כן‬
‫שאר אי השיוויונות מסוג ‪ 2‬נשמרים‪.‬‬
‫הכנסה ־ לאחר הוצאה של צומת ‪ u‬מהתור‪ ,‬בזמן סריקת שכניו‪ ,‬התגלה צומת ‪ .v‬כשצומת ‪ v‬נכנס לתור‪ ,‬הוא הופך להיות‬
‫‪ .vr+1‬לפני כן ‪ u‬נשלף מהתור‪ ,‬לכן מהנחת האינדוקציה ) ‪:d(u) ≤ d(v1‬‬
‫}‪ ,d(vr+1 ) |{z‬וזה מה שרצינו להראות ב־‪.1‬‬ ‫‪= d(u) + 1 ≤ d(v1 ) + 1‬‬
‫}‪= d(v) |{z‬‬
‫‪v=vr+1‬‬ ‫‪line 15‬‬

‫) ‪,d(vr‬‬ ‫}‪≤ d(u) + 1 |{z‬‬ ‫בנוסף‪ ,‬מהנחת האינדוקציה‪ ,d(vr ) ≤ d(u) + 1 :‬ולכן קיבלנו כי ) ‪= d(vr+1‬‬
‫}‪= d(v) |{z‬‬
‫}‪|{z‬‬ ‫}‪|{z‬‬
‫‪f rom 1‬‬ ‫‪line 15‬‬ ‫‪v=vr+1‬‬ ‫‪f rom 1‬‬
‫וזה ‪) 2‬כיוון שכל שאר אי השיוויונות לא השתנו(‪.‬‬

‫מסקנה ‪) 2.8‬מסקנה ‪ (4‬אם צמתים ‪ u, v‬מוכנסים לתור בהמשך האלגוריתם וצומת ‪ u‬הוכנס קודם אזי )‪ d(u) ≤ d(v‬כאשר ‪ v‬נכנס‬
‫לתור‪ .‬ההוכחה ע”י שימוש בלמה ‪ 3‬ומכך שכל צומת מקבל ‪ d‬סופי פעם אחת‪.‬‬

‫־ יהא )‪ G = (V, E‬גרף מכוון ‪ /‬לא מכוון‪ ,‬ונניח ‪ BFS‬מורץ ממקור ‪ .s‬אזי‪:‬‬ ‫)משפט ‪ (3‬נכונות ‪BFS‬‬ ‫משפט ‪2.9‬‬
‫‪ .1‬האלגוריתם מגלה כל צומת נגיש מ־‪s‬‬
‫‪ .2‬בסיום לכל ‪ v‬מתקיים ש־)‪d(v) = δ(s, v‬‬
‫‪ .3‬אם ‪ v 6= s‬ו־‪ v‬נגיש מ־‪ s‬אזי קיים מסלול קצר ביותר )מק”ב( מ־‪ s‬ל־‪ v‬המורכב ממק”ב מ־‪ s‬ל־)‪ π(v‬ואחריו הקשת )‪.(π(v), v‬‬
‫הוכחה‪ :‬נניח בשלילה שצומת כלשהו מקבל ערך ‪ d‬לא שווה ל־)‪ .δ(s, v‬יהא ‪ v‬צומת כזה עם )‪ δ(s, v‬מינימלי )כלומר נבחר צומת‬
‫כלשהו בעל מרחק מינימלי מבין אלו שמרחקם לא שווה ממש ל־)‪.(δ(s, v‬‬
‫נשים לב ש־‪ ,v 6= s‬כיוון שעבור ‪ v = s‬נקבל ‪= 0‬‬
‫}‪ ,d(v) = d(s) |{z‬וגם ‪ ,δ(s, v) = δ(s, s) = 0‬ומכאן שנקבל כי )‪δ(s, v) = d(v‬‬
‫‪line 6‬‬
‫בניגוד לדרישה הראשונה‪ .‬כמו כן‪ ,‬נשים לב שמתקיים כי )‪ d(v) > δ(s, v‬לפי למה ‪.2‬‬
‫יש מסלול מ־‪ s‬ל־‪) v‬כי אחרת אם אין מסלול כזה הרי ש־∞ = )‪ ,δ(s, v‬ואז לא ייתכן שמתקיים )‪ .(d(v) > δ(s, v‬יהא ‪ u‬הצומת‬
‫‪ .(s‬כיוון שזה מסלול קצר ביותר מתקיים ש־‪.δ(s, v) = δ(s, u) + 1‬‬ ‫שלפני ‪ v‬במק”ב מ־‪ s‬ל־‪u → v) v‬‬
‫ממינימליות הבחירה של ‪ v‬נובע ש־)‪) d(u) = δ(s, u‬ה־‪ v‬שבחרנו הוא בעל )‪ δ(s, v‬מינימלי מבין הצמתים שמקיימים את התכונה‬
‫ש־)‪ ,d(v) 6= δ(s, v‬לכן אם גם ‪ u‬היה מקיים ש־)‪ ,d(u) 6= δ(s, u‬אז כיוון ש־)‪ ,δ(s, v) > δ(s, u‬היינו מקבלים ש־‪ v‬לא מינימלי‪ ,‬אלא‬
‫‪ u‬מינימלי‪ ,‬בניגוד לאופן שבו בחרנו את ‪.(v‬‬
‫סך הכל קיבלנו כי ‪) d(v) > δ(s, v) = δ(s, u) + 1 = d(u) + 1‬נסמן ב־*(‪.‬‬
‫נתבונן בזמן שבו האלגוריתם מוציא את ‪ u‬מהתור )שורה ‪ .(11‬מה צבע ‪ v‬באותו רגע?‬

‫‪8‬‬
‫‪ .1‬אם ‪ v‬לבן‪ d(v) = d(u) + 1 :‬נקבע אח”כ כאשר ‪ v‬מתגלה )שורה ‪ .(15‬סתירה ל־*‪.‬‬
‫‪ .2‬אם ‪ v‬שחור‪ :‬כלומר ‪ v‬נשלף מהתור‪ ,‬וממסקנה ‪ 4‬נקבל כי )‪ ,d(v) ≤ d(u‬וזו סתירה ל־*‪.‬‬
‫‪ .3‬אם ‪ v‬אפור‪ :‬זה ייתכן רק אם ‪ v‬התגלה במהלך סריקת שכניו של צומת אחר )לפני שנסרקו שכניו של ‪ .(u‬כלומר ‪ v‬נצבע אפור‬
‫כאשר צומת כלשהו‪ ,‬נסמנו ב־‪ w‬נשלף מהתור‪ ,‬וזה קרה לפני ש־‪ u‬נשלף מהתור‪ .‬לכן ‪ ,d(v) = d(w) + 1‬כיוון ש־‪ v‬התגלה דרך‬
‫‪) w‬שורה ‪ .(15‬ממסקנה ‪ 4‬מקבלים כי )‪ d(w) ≤ d(u‬ומכאן ש־‪ ,d(v) ≤ d(u) + 1‬וזו סתירה ל־*‪.‬‬

‫קיבלנו סתירה להנחת השלילה‪ ,‬ולכן קיבלנו סך הכל כי לכל צומת ‪ v‬מתקיים ש־)‪) d(v) = δ(s, v‬שזה מה שרצינו להוכיח ב־‪.(2‬‬
‫מכאן שכל צומת נגיש התגלה‪ ,‬כי אחרת ∞ = )‪) d(v‬וזה לא אפשרי(‪ ,‬כך שקיבלנו גם את מה שרצינו להוכיח ב־‪.1‬‬
‫אם )‪ u = π(v‬אזי ‪) d(v) = d(u) + 1‬כי שורות ‪16‬־‪ 15‬תמיד נקבעות יחד(‪ ,‬ולכן מק”ב מ־‪ s‬ל־‪ v‬מתקבל ע”ׁי מק”ב מ־‪ s‬ל־‪u‬‬
‫ואחריו הקשת )‪ ,(π(v), v) = (u, v‬וזה מה שרצינו להוכיח ב־‪.3‬‬

‫עץ ‪BF‬‬ ‫‪2.5‬‬


‫הגדרה ‪ 2.10‬יהא ‪ G‬גרף‪ s ,‬צומת בו‪) H ⊆ G ,‬תת־גרף‪ ,‬כלומר מכיל חלק מהצמתים וחלק מהקשתות של צמתים אלו(‪ .‬נאמר ש־‪H‬‬
‫הוא עץ ‪ BF‬אם הוא מכיל את כל הצמתים הנגישים מ־‪ s‬כך שלכל צומת נגיש ‪ v‬יש מסלול פשוט יחיד בגרף ‪ H‬מ־‪ s‬ל־‪ v‬שהוא מק”ב‬
‫ב־‪.G‬‬
‫אלגוריתם ‪ BFS‬מייצר ‪ π‬לכל ‪ .v‬נגדיר ) ‪ Gπ = (Vπ , Eπ‬באופן הבא‪:‬‬
‫}‪Vπ = {v ∈ V |π(v) 6= N IL} ∪ {s‬‬

‫}}‪Eπ = {(π(v), v)|v ∈ Vπ \{s‬‬

‫ל־ ‪ Gπ‬נקרא תת־גרף הקודמים‪.‬‬

‫הערה ‪ Vπ 2.11‬היא קבוצת כל הצמתים שיש להם קודם )‪ ,(successor‬והצומת ‪) s‬שאין לו קודם(‪ .‬נשים לב שמדובר בקבוצת הצמתים‬
‫הנגישים מ־‪.s‬‬

‫למה ‪) 2.12‬למה ‪ (6‬אלגוריתם ‪ BFS‬מייצר ‪ π‬כך ש־ ‪ Gπ‬הוא עץ ‪.BF‬‬


‫הוכחה‪ :‬שורה ‪ 16‬באלגוריתם קובעת ‪ π(v) = u‬אם ‪ (u, v) ∈ E‬ו־∞ < )‪ .δ(s, v‬לכן ‪ Vπ‬מכיל את כל הצמתים הנגישים מ־‪Gπ .s‬‬
‫הוא קשיר ויש בו ‪ |Eπ | = |Vπ | − 1‬קשתות‪ ,‬לכן הוא עץ‪ .‬מכאן שיש בו מסלול פשוט יחיד מ־‪ s‬לכל צומת אחר ב־ ‪ .Vπ‬נפעיל את‬
‫משפט ‪) 5‬הוכחת הנכונות( אינדוקטיבית‪ ,‬ונקבל שכל מסלול כזה הוא מסלול קצר ביותר ב־‪.G‬‬

‫‪9‬‬
‫אלגוריתם ‪ (Depth First Search) DFS‬־ פרק ‪ 22‬בספר‬ ‫‪3‬‬
‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪3.1‬‬
‫מניחים שהקלט הוא רשימת שכנויות‪ .‬בהתחלה כל הצמתים לבנים‪ .‬באופן איטרטיבי‪ :‬לכל צומת בגרף )בניגוד ל־‪ BFS‬בו התחלנו‬
‫מצומת מקור מסוים(‪ ,‬אם הצומת לבן‪” ,‬נבקר” בו ־ בביקור בצומת תחילה נעלה את הזמן ב־‪ .1‬לאחר מכן‪ ,‬נצבע אותו באפור‪ ,‬ונסמן‬
‫לו זמן התחלה‪ .‬כעת נתבונן בשכנים שלו ־ לכל שכן‪ ,‬אם הוא לבן‪ ,‬נעבור ”לבקר” בו )כלומר‪ ,‬נעבור לפעול עליו באופן רקורסיבי‪ ,‬לכן‬
‫הפעולה היא לעומקו של הגרף‪ ,‬ולא לרוחבו(‪ .‬כאשר לא נותרו לצומת שכנים לבנים‪ ,‬נצבע אותו בשחור )סיימנו את הטיפול בו(‪ .‬כמו‬
‫כן‪ ,‬נעלה את הזמן ב־‪ ,1‬ונקבע לו זמן סיום טיפול )בזה יסתיים ה”ביקור” בצומת(‪.‬‬

‫הערה ‪ 3.1‬האלגוריתם מתואר עבור גרף מכוון‪ ,‬אך נשים לב שאם הגרף אינו מכוון‪ ,‬נוכל להמיר אותו לגרף מכוון ע”י שכפול כל קשת‬
‫)‪ ,(u, v‬כך שאחת היא מ־‪ u‬ל־‪ ,v‬והשנייה מ־‪ v‬ל־‪.u‬‬

‫מבנה הנתונים שנשתמש בו‬ ‫‪3.2‬‬


‫הצבע של ‪u‬‬ ‫)‪color(u‬‬
‫האב של ‪ N IL) u‬אם אין(‬ ‫)‪π(u‬‬
‫זמן הגילוי )זמן תחילת הטיפול( של הצומת ‪(discovery time) u‬‬ ‫)‪d(u‬‬
‫זמן סיום הטיפול בצומת ‪(nishing time) u‬‬ ‫)‪f (u‬‬

‫האלגוריתם‬ ‫‪3.3‬‬

‫‪10‬‬
‫תיאור ריצת האלגוריתם עבור גרף לדוגמה‪:‬‬ ‫‪3.3.1‬‬

‫סיבוכיות זמן‬ ‫‪3.3.2‬‬


‫לאחר האתחול שום צומת לא נצבע בלבן‪ ,‬ולכן הבדיקה שהצומת לבן )שורה ‪ 5‬ב־‪ ,DFS‬ושורה ‪ 6‬ב־‪ (DFS VISIT‬מבטיחה שנבקר‬
‫בכל צומת פעם אחת‪ .‬סך כל הפעולות ב־‪ DFS VISIT‬לא כולל לולאת ה־‪) for‬שמתחילה בשורה ‪ ,(4‬עולות ) ‪ O(V‬כי פעולות הצביעה‬
‫‪ /‬שינויי הזמן עולות )‪ .O(1‬בלולאת ה־‪ for‬של ‪) DFS VISIT‬שורה ‪ ,(4‬רשימת שכני ‪ u‬נסרקת פעם אחת בדיוק לכל צומת )שכן‬
‫כאמור מבקרים בכל צומת פעם אחת(‪ ,‬ולכן על פני כל הביקורים לולאת ה־‪ for‬עולה סך הכל )‪ .O(E‬כמו כן‪ ,‬האתחול עולה ) ‪O(V‬‬
‫כי בכל צומת עושים מספר קבוע של פעולות‪ .‬לכן סך הכל האלגוריתם נעשה ב־)‪.O(V + E‬‬

‫יער ‪DF‬‬ ‫‪3.4‬‬


‫הגדרה ‪ 3.2‬־ נגדיר את תת־גרף הקודמים של אלגוריתם ה־‪ DFS‬באופן מעט שונה מהאופן בו הגדרנו עבור אלגוריתם ה־‪ ,BFS‬כך‪:‬‬
‫) ‪Gπ = (V, Eπ‬‬

‫}‪Eπ = {(π(v), v)|v ∈ Vπ ∧ π(v) 6= N IL‬‬

‫)ניתן להגיד ש־‪ Gπ‬הוא יער של עצי ‪(DF‬‬

‫‪ (Parenthesis‬־ ב־‪ DFS‬של גרף מכוון או לא מכוון לכל זוג צמתים ‪ u, v ∈ V‬מתקיים‬ ‫)משפט הסוגריים‪theorem ,‬‬ ‫משפט ‪3.3‬‬
‫רק אחד מהבאים‪:‬‬

‫‪[d(u), f (u)]∩[d(v), f (v)] = ∅∧(u is not ancestor of v in the DF f orest)∧(v is not ancestor of u in the DF f orest) .1‬‬
‫)הכוונה כאן היא ש־])‪ [d(u), f (v‬הוא הקטע הסגור שמוגדר ע”י זמן תחילת וסיום הטיפול בצומת ‪ u‬באלגוריתם ‪.(DFS‬‬
‫‪([d(u), f (u)] ⊂ [d(v), f (v)]) ∧ (v is ancestor of u in the DF f orest) .2‬‬
‫‪([d(v), f (v)] ⊂ [d(u), f (u)]) ∧ (u is ancestor of v in the DF f orest) .3‬‬

‫הוכחה‪ :‬בלי הגבלת הכלליות נניח )‪ .d(u) < d(v‬קיימים שני מקרים )נקבל כאן את מקרים ‪ 1‬ו־‪ ,3‬באופן סימטרי אילו היינו מניחים‬
‫כי )‪ d(v) < d(u‬היינו מקבלים את מקרים ‪ 1‬ו־‪:(2‬‬

‫‪11‬‬
‫‪ .1‬אם )‪ :d(v) < f (u‬ידוע ש־)‪ .d(u) < d(v) < f (u‬איפה נמצא )‪ ?f (v‬מהנתון כי )‪ ,d(u) < d(v‬כלומר גילינו את ‪ u‬לפני‬
‫שגילינו את ‪ ,v‬עולה שנסיים את הטיפול ב־‪ v‬לפני שנסיים את הטיפול ב־‪) u‬נובע מרקורסיביות האלגוריתם(‪ .‬מכאן שמתקיים‬
‫)‪ .f (v) < f (u‬כמו כן‪ ,‬כמובן שמתקיים )‪ ,d(v) < f (v‬כך שסך הכל קיבלנו כי מתקיים )‪,d(u) < d(v) < f (v) < f (u‬‬
‫וזה האגף השמאלי של מקרה ‪ .3‬נשים לב שאם גילינו את ‪ v‬אחרי שגילינו את ‪ ,u‬ולפני שסיימנו לטפל ב־‪ ,u‬אז שוב מאופיו‬
‫הרקורסיבי של האלגוריתם נובע כי קיים מסלול מ־‪ u‬ל־‪ v‬כך ש־‪ v‬הוא צאצא של ‪ .u‬לכן קיבלנו את אגף ימין של מקרה ‪,3‬‬
‫וסך הכל מתקיים מקרה ‪.3‬‬
‫‪ .2‬אם )‪ :f (u) < d(v‬ידוע כי )‪ ,d(u) < f (u‬וכן ש־)‪ d(v) < f (v‬כי זמן סיום תמיד גדול מזמן תחילת טיפול‪ .‬כמו כן מכך‬
‫ש־)‪ f (u) < d(v‬מקבלים סך הכל כי )‪ ,d(u) < f (u) < d(v) < f (v‬וזה מקרה ‪) 1‬הקטעים ])‪ [d(u), f (u‬ו־])‪ [d(v), f (v‬זרים‪,‬‬
‫לכן החיתוך בינהם ריק(‪ .‬נשים לב שבמקרה זה ‪ u‬אינו אב קדמון של ‪ ,v‬וגם ‪ v‬אינו אב קדמון של ‪.u‬‬

‫משפט ‪) 3.4‬משפט המסלול הלבן( ־ ביער ‪ DF‬של גרף מכוון או לא מכוון )‪ u ,G = (V, E‬הוא אב קדמון של ‪ ⇐⇒ v‬בזמן )‪d(u‬‬
‫יש מסלול בגרף ‪ G‬מ־‪ u‬ל־‪ v‬שכולו צמתים לבנים‪.‬‬
‫הוכחה‪ ⇐ :‬נניח ‪ u‬אב קדמון של ‪ v‬ביער ה־‪ .DF‬נחלק למקרים‪:‬‬
‫‪ :u = v .1‬בזמן )‪ u ,(d(v) =) d(u‬לבן‪ ,‬לכן יש מסלול באורך ‪) 0‬באורך צומת ‪ (1‬שכולו לבן )כלומר‪ ,‬מתקיים באופן ריק(‪.‬‬
‫‪ :u 6= v .2‬לפי משפט הסוגריים מתקיים )‪ ,d(u) < d(v) < f (v) < f (u‬לכן בזמן )‪ d(u‬הצבע של ‪ v‬לבן‪ .‬באופן דומה‪ ,‬ניתן לומר‬
‫‪ u‬בעץ ה־‪ DF‬שהוא לבן‪ ,‬כיוון ש־‪ u‬אב קדמון שלו )ממשפט הסוגריים נובע מכך ש־‪ u‬אב‬ ‫לכל צומת ‪ w‬שנמצא במסלול ‪v‬‬
‫קדמון של ‪ w‬ש־)‪ ,d(u) < d(w‬ומכאן ש־‪ w‬לבן בזמן )‪ .(d(u‬לכן סך הכל קיבלנו כי כל הצמתים במסלול לבנים‪.‬‬
‫⇒ נניח כי בזמן )‪ d(u‬יש מסלול בגרף ‪ G‬מ־‪ u‬ל־‪ v‬שכולו צמתים לבנים‪ .‬יהי מסלול כלשהו כנ”ל‪ .‬נניח בשלילה כי ‪ u‬אינו אב קדמון‬
‫של ‪ v‬בעץ ה־‪ .DF‬מכאן נובע שקיים צומת ‪ w‬במסלול הלבן )בגרף ‪ ,(G‬כך ש־‪ w‬הצומת הראשון במסלול הלבן שעבורו מתקיים כי ‪u‬‬
‫אינו אב קדמון שלו ביער ה־‪ .DF‬כיוון ש־‪ w‬הצומת הראשון במסלול הלבן שאינו צאצא של ‪ ,u‬הרי שהצומת הקודם במסלול‪ ,‬נסמנו‬
‫ב־‪ ,z‬כן צאצא של ‪) u‬ייתכן ‪.(z = u‬‬
‫מכך ש־‪ z‬צאצא של ‪ u‬נובע כי בזמן )‪ d(z‬הצומת ‪ u‬אפור )אנחנו עדיין מטפלים בצאצאים שלו(‪ .‬כמו כן‪ ,‬מכך שקיים מסלול‬
‫באורך ‪ 1‬מ־‪ z‬ל־‪ z) w‬הצומת שלפני ‪ w‬במסלול הלבן ב־‪ ,(G‬הרי ש־‪ w‬שכן של ‪ .z‬לכן‪ ,‬לפני שנסיים את הטיפול ב־‪) z‬ולכן גם לפני‬
‫שנסיים את הטיפול ב־‪ (u‬נעבור ב־‪ w‬במהלך סריקת שכני ‪ .z‬כעת יש שתי אפשרויות למצב של ‪ w‬בזמן המעבר בקשת )‪:(z, w‬‬
‫‪ .1‬אם ‪ w‬לבן‪ :‬אזי הקשת )‪ (z, w‬מצטרפת לעץ ה־‪ ,DF‬ומכאן ש־‪ w‬צאצא של ‪ u‬בעץ ה־‪ ,DF‬בסתירה להנחת השלילה‪.‬‬
‫‪ .2‬אם ‪ w‬לא לבן‪ :‬כיוון שכאשר התחלנו ‪ w‬היה לבן‪ ,‬הרי ש־)‪ .d(u) < d(w‬כמו כן‪ ,‬כיוון שבשלב זה לא סיימנו עדיין עם ‪u‬‬
‫)הוא אפור(‪ ,‬מתקיים )‪ .d(u) < d(w) < f (u‬ממשפט הסוגריים נובע כי בהכרח מתקיים ∧ )])‪([d(w), f (w)] ⊂ [d(u), f (u‬‬
‫)‪ (u is ancestor of w in the DF f orest‬כיוון שהאפשרויות היחידות הן הכלה או זרות‪ ,‬ולכן ‪ w‬צאצא של ‪ u‬בסתירה להנחת‬
‫השלילה‪.‬‬

‫הגדרה ‪ 3.5‬־ נגדיר לכל קשת בגרף את סוג הקשת באופן הבא‪:‬‬
‫קשת עץ )‪ (Tree Edge‬־ קשת שנמצאת ב־ ‪ .Gπ‬קשת )‪ (u, v‬תהיה ‪ tree edge‬אם הגענו ל־‪ v‬במהלך הסריקה מ־‪ ,u‬ע”י טיול בקשת‬
‫)‪.(u, v‬‬
‫קשת אחורית )‪ (Back Edge‬־ קשת שמחברת בין ‪ u‬לאב קדמון שלו ‪ v‬בגרף ‪) Gπ‬קשת שכאשר עוברים בה בסריקה מגיעים ממנה‬
‫לצומת אפור‪ ,‬כלומר לאב קדמון שהטיפול בו טרם הסתיים(‪ .‬גם קשתות עצמיות יחשבו כ־‪.back edges‬‬
‫קשת קדמית )‪ (Forward Edge‬־ קשת שמחברת בין ‪ u‬לצאצא שלו ‪ v‬ושאינה מהווה חלק מהגרף ‪) Gπ‬קשת שכאשר עוברים בה‬
‫בסריקה מגיעים ממנה לצומת שחור‪ ,‬כיוון שביקרנו בו כבר וסיימנו איתו(‬
‫קשת חוצה )‪ (Cross Edge‬־ כל שאר הקשתות‪ .‬יכולות להיות קשתות בין צמתים באותו עץ ‪ DF‬כל עוד אין בינהם יחסי צאצא־אב‬
‫קדמון‪ ,‬או בין צמתים בעצי ‪ DF‬שונים‪.‬‬

‫הערה ‪ 3.6‬־ עבור קשת )‪ (u, v‬מתקיים תמיד ש־‪ u‬אפור )אנחנו בתהליך סריקת השכנים שלו(‪ .‬נוכל לקטלג את הקשתות באופן הבא‬
‫לפי צבע הצומת ‪:v‬‬
‫‪ .1‬אם ‪ v‬לבן‪ :‬הקשת היא ‪.tree edge‬‬
‫‪ .2‬אם ‪ v‬אפור‪ :‬הקשת היא ‪.back edge‬‬

‫‪12‬‬
‫‪ .3‬אם ‪ v‬שחור‪:‬‬
‫• אם )‪ d(u) < d(v‬אז הקשת היא ‪) forward edge‬נובע ממשפט הסוגריים‪ ,‬שכן בשלב זה ‪ u‬אפור‪ ,‬ולכן מתקיים‬
‫)‪ d(u) < d(v) < f (v) < f (u) ⇐ d(u) < d(v) < f (u‬כך ש־‪ v‬צאצא של ‪ u‬אבל הקשת )‪ (u, v‬אינה קשת בגרף‬
‫ה־‪.(DF‬‬
‫• אם )‪ d(v) < d(u‬אז הקשת היא ‪) cross edge‬שוב‪ ,‬נובע ממשפט הסוגריים‪ ,‬שכן‬
‫)‪ d(v) < f (v) < d(u) < f (u) ⇐ d(v) < d(u) < f (u‬ולכן אין בין ‪ u‬ל־‪ v‬יחסי צאצא־אב קדמון(‪.‬‬

‫הערה ‪ 3.7‬־ בתיאור ריצת האלגוריתם עבור גרף לדוגמה‪ ,‬מסומנות בגרף הקשתות מהסוגים השונים ע”י האות הראשונה של הסוג‬
‫)למשל ‪.(C = Cross edge‬‬

‫משפט ‪ 3.8‬־ ב־‪ DFS‬של גרף לא מכוון אין ‪ forward edges‬ואין ‪) cross edges‬כלומר יש רק ‪ tree edges‬ו־‪.(back edges‬‬

‫הוכחה‪ :‬נתבונן בקשת )‪) (u, v‬כלומר אנחנו סורקים את שכני ‪ ,u‬ובוחנים את הקשת ממנו ל־‪ ,(v‬ונניח בה”כ כי )‪ .d(u) < d(v‬כיוון‬
‫שבשלב זה ‪ u‬אפור‪ ,‬נובע כי )‪) d(u) < d(v) < f (v) < f (u) ⇐ d(u) < d(v) < f (u‬ממשפט הסוגריים(‪ .‬כעת יש שתי אפשרויות‪:‬‬
‫‪ .1‬אם נעבור על הקשת )‪ (u, v‬בפעם הראשונה מ־‪ u‬ל־‪ v :v‬חייב להיות לבן )אחרת‪ ,‬אם ‪ v‬לא לבן‪ ,‬הרי שביקרנו בו כבר‪ ,‬ואז‬
‫היינו עוברים בקשת )‪ (u, v‬בכיוון מ־‪ v‬ל־‪ .(u‬לכן הקשת היא ‪.tree edge‬‬

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

‫‪13‬‬
‫מיון טופולוגי )בגרף מכוון חסר מעגלים ־ ‪ (DAG‬־ פרק ‪ 22‬בספר‬ ‫‪4‬‬
‫הערה ‪ 4.1‬גרף מכוון חסר מעגלים באנגלית זה ‪ ,directed acyclic graph‬לכן בקיצור נאמר ‪.DAG‬‬

‫הגדרה ‪ 4.2‬מיון טופולוגי של גרף מכוון חסר מעגלים )‪ G = (V, E‬הוא סידור לינארי של כל צמתי הגרף‪ ,‬כך שאם הקשת )‪ (u, v‬בגרף‬
‫)כלומר יש קשת שעוברת מ־‪ u‬ל־‪ (v‬אזי ‪ u‬מופיע לפני ‪ v‬בסידור זה‪.‬‬

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

‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪4.1‬‬


‫מריצים אלגוריתם ‪ ,DFS‬ומשתמשים בזמן הסיום של כל צומת כדי למיין את הצמתים בגרף בסדר יורד )כך שהצומת עם זמן הסיום‬
‫הגדול ביותר יהיה בראש הרשימה‪ ,‬וזה עם זמן הסיום הקטן ביותר בסופה(‪.‬‬
‫הנקודה שחשוב לשים לב אליה‪ ,‬היא שכיוון שאנחנו מכניסים צומת לתחילת הרשימה בכל פעם שאנחנו ”מסיימים איתו” ב־‪,DFS‬‬
‫בפועל נקבל רשימה ממויינת כנ”ל‪ ,‬וכן הריצה תעשה בסיבוכיות לינארית בגודל הקלט )ב־)|‪ (O(|V | + |E‬ולא בסיבוכיות של )‪nlog(n‬‬
‫כמו שהיינו מקבלים אילו היינו תחילה מחשבים את זמני הסיום ורק אז מייצרים לפיהם את הרשימה הממויינת באמצעות אלגוריתם‬
‫מיון כלשהו‪.‬‬

‫מבנה הנתונים שנשתמש בו‬ ‫‪4.2‬‬


‫רשימה מקושרת של צמתים )בנוסף למבנה הנתונים הדרוש ל־‪.(DFS‬‬

‫האלגוריתם‬ ‫‪4.3‬‬

‫למה ‪ 4.4‬גרף מכוון ‪ G‬אינו מכיל מעגלים ⇒⇐ ריצת ‪ DFS‬על ‪ G‬אינה מניבה קשתות אחורה )כלומר‪ ,‬אין ‪.(back edges‬‬
‫הוכחה‪ :⇐ :‬נניח שקיימת ‪ (u, v) back edge‬בכיוון מ־‪ u‬ל־‪ v‬בגרף‪ .‬אזי ‪ v‬אב קדמון של ‪ u‬ביער ה־‪.DFS‬‬
‫לכן קיים מסלול של ‪ tree edges‬שעובר מ־‪ v‬ל־‪ u‬בגרף‪ .‬מסלול זה יחד עם הקשת האחורית )‪ (u, v‬מהווה מעגל בגרף‪.‬‬
‫⇒‪ :‬נניח שקיים מעגל בגרף‪ .‬יהי ‪ u‬הצומת עם זמן גילוי )‪ d(u‬מינימלי מבין הצמתים במעגל ונסמן ב־‪ v‬את הצומת שלפני ‪u‬‬
‫במעגל )כלומר הקשת )‪ (u, v‬היא הקשת האחרונה במעגל(‪ .‬אזי‪ ,‬בזמן )‪ d(u‬כל הצמתים במעגל לבנים‪ ,‬ובפרט יש מסלול לבן מ־‪u‬‬
‫ל־‪ ⇐ v‬לפי משפט המסלול הלבן‪ v ,‬צאצא של ‪ u‬בעץ ה־‪ ⇐ DFS‬הקשת )‪ (u, v‬היא קשת אחורית‪.‬‬

‫‪14‬‬
‫‪ 4.4‬הוכחת נכונות‬
‫משפט ‪ 4.5‬האלגוריתם )‪ Topological-Sort(G‬מייצר מיון טופולוגי של גרף מכוון ללא מעגלים )‪.G = (V, E‬‬

‫הוכחה‪ :‬מספיק להראות כי לכל ‪ u, v ∈ V‬כך ש־‪ u 6= v‬ו־‪ ,(u, v) ∈ E‬מתקיים )‪.f (u) > f (v‬‬
‫במעבר על קשת כלשהי )‪ (u, v‬במהלך ה־‪ ,DFS‬הצומת ‪ v‬לא יכול להיות אפור )שכן אילו ‪ v‬היה אפור היינו מקבלים כי הקשת‬
‫)‪ (u, v‬היא ‪ ,back edge‬ומכאן שיש מעגל בגרף בסתירה להנחה(‪ .‬לכן בזמן המעבר בקשת )‪ (u, v‬הצומת ‪ v‬לבן או שחור‪ .‬נפצל‬
‫למקרים‪:‬‬
‫• אם ‪ v‬לבן‪ :‬הקשת )‪ (u, v‬היא קשת עץ‪ ,‬כך ש־‪ v‬צאצא של ‪ u‬בעץ ה־‪ DFS‬וממשפט הסוגריים מקבלים כי‬
‫)‪ ,d(u) < d(v) < f (v) < f (u‬ובפרט )‪ ,f (v) < f (u‬כדרוש‪.‬‬
‫• אם ‪ v‬שחור‪ :‬אזי סיימנו כבר עם ‪ v‬אך לא סיימנו עדיין עם ‪ ,u‬לכן אם נסמן ב־‪ current‬את הזמן הנוכחי נקבל כי‬
‫)‪) f (v) < current < f (u‬ממשפט הסוגריים נובע כי האפשרויות הן )‪ d(v) < f (v) < d(u) < f (u‬או‬
‫)‪ ,(d(u) < d(v) < f (v) < f (u‬ובפרט )‪ ,f (v) < f (u‬כדרוש‪.‬‬

‫‪15‬‬
‫‪(Strongly‬‬ ‫פירוק לרכיבי קשירות חזקה )ּ‪Connected Components‬‬ ‫‪5‬‬
‫הגדרה ‪ 5.1‬רכיב קשירות חזקה )או רק”ח( בגרף מכוון )‪ G = (V, E‬הוא קבוצה מקסימלית של צמתים ‪ C ⊆ V‬כל שלכל זוג צמתים‬
‫‪.v‬‬ ‫‪ u‬וגם מסלול ‪u‬‬ ‫‪ u, v ∈ C‬יש מסלול ‪v‬‬

‫הגדרה ‪ 5.2‬גרף ‪ (Transposed) GT‬של גרף )‪ G = (V, E‬הוא הגרף ) ‪ ,GT = (V, E T‬כך ש־}‪) E T = {(v, u)|(u, v) ∈ E‬כלומר‬
‫הגרף עם כל הקשתות בכיוון ההפוך(‪.‬‬

‫הערה ‪5.3‬‬

‫‪ .1‬ל־‪ G‬ול־ ‪ GT‬יש בדיוק את אותם רק”חים )נובע מההגדרה של רק”ח(‪.‬‬


‫‪ .2‬יצירת הגרף ‪ GT‬מגרף ‪ G‬שנתון ע”י רשימת שכנויות תעשה ב־)|‪ O(|V | + |E‬ע”י מעבר על רשימת הרשימות המקושרות‪ ,‬ויצירת‬
‫הגרף החדש‪.‬‬
‫למשל עבור הצומת ‪ ,4‬אם ‪ 17‬שכן שלו )כלומר מופיע ברשימת השכנים של ‪ ,(4‬נגש לרשימת השכנים של ‪ 17‬בגרף המשוחלף‪,‬‬
‫ונוסיף אליה את ‪.4‬‬

‫הגדרה ‪ 5.4‬גרף ‪ (Strongly Connected Components) GSCC‬של גרף )‪ G = (V, E‬הוא גרף הרכיבים חסר המעגלים שמתקבל‬
‫ע”י כך שמכווצים כל רק”ח של ‪ G‬לצומת יחיד )הקשתות מייצגות קשתות בגרף ‪ G‬המקורי בין צמתים ברכיבי קשירות שונים(‪.‬‬

‫הערה ‪ 5.5‬נשים לב שהגרף ‪ GSCC‬הוא חסר מעגלים‪ ,‬שכן אילו היה בו מעגל‪ ,‬זו היתה סתירה למקסימליות של קבוצת הצמתים‬
‫ברק”ח‪.‬‬

‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪5.1‬‬


‫האלגוריתם רץ על גרף מכוון כלשהו )לאו דוקא חסר מעגלים( ‪ .G‬תחילה נריץ עליו ‪ DFS‬על מנת לקבל את רשימת הצמתים ממוינים‬
‫לפי זמני סיום‪ .‬לאחר מכן‪ ,‬נחשב ל־‪ G‬את הגרף המשוחלף‪ .GT ,‬לבסוף נריץ ‪ DFS‬על ‪ GT‬באופן מעט שונה‪ :‬במקום שבכל פעם‬
‫נתחיל חיפוש מצומת כלשהו ללא חשיבות לסדר‪ ,‬הפעם נעבור על הצמתים )בלולאה החיצונית( לפי הסדר היורד של זמני הסיום‬
‫שקיבלנו מהשלב הקודם‪ .‬העצים שנקבל במהלך ריצת ה־‪ DFS‬השניה )על ‪ GT‬עם השינוי שעשינו( הם הרק”חים‪.‬‬

‫לדוגמה‪:‬‬

‫‪16‬‬
‫האלגוריתם‬ ‫‪5.2‬‬

‫הוכחת נכונות‬ ‫‪5.3‬‬


‫למה ‪ 5.6‬תהי ‪ U ⊆ V‬קבוצה של צמתים‪ .‬נסמן‪.f (U ) = max{f (x)|x ∈ U } ,d(U ) = min{d(x)|x ∈ U } :‬‬
‫יהיו ‪ C, C 0‬שני רק”חים של ‪ G‬כך ש־ ‪ .C 6= C 0‬נניח שקיימת קשת ‪ (u, v) ∈ E‬מ־‪ u‬ל־‪ v‬כך ש־‪ u ∈ C‬ו־ ‪ .v ∈ C 0‬אזי ) ‪.f (C) > f (C 0‬‬

‫הוכחה‪ :‬נפצל למקרים‪:‬‬


‫‪ .1‬אם ) ‪ :d(C) < d(C 0‬נסמן ב־‪ x‬את הצומת הראשון ב־‪ C‬שגילינו בריצת ה־‪ DFS‬הראשונה )כלומר )‪ d(x) < d(y‬לכל ‪.(y ∈ C‬‬
‫בזמן )‪ d(x‬כל הצמתים ב־‪ C‬וב־ ‪ C 0‬הם לבנים ⇐ יש מסלול מ־‪ x‬לכל צומת ‪ ,y ∈ C ∪ C 0‬וכל הצמתים במסלול לבנים‪.‬‬
‫ממשפט המסלול הלבן נובע כי לכל ‪ y ∈ C ∪ C 0‬מתקיים כי ‪ y‬צאצא של ‪ ⇐ x‬לכל ‪ y ∈ C 0‬מתקיים )‪⇐ f (y) < f (x‬‬
‫)‪ ,f (C 0 ) < f (C) ⇐ f (C 0 ) = max{f (y)|y ∈ C 0 } < f (x) ≤ max{f (w)|w ∈ C} = f (C‬כדרוש‪.‬‬

‫‪ .2‬אם )‪ :d(C 0 ) < d(C‬נסמן ב־‪ y‬את הצומת בעל זמן הגילוי המינימלי ב־ ‪) C 0‬כלומר ) ‪ .(d(y) = d(C 0‬בזמן )‪ d(y‬כל הצמתים‬
‫ב־ ‪ C 0‬הם לבנים ⇐ יש מסלול מ־‪ y‬לכל צומת ב־ ‪ ,C 0‬וכל הצמתים במסלול לבנים ⇐ כל הצמתים ב־ ‪ C 0‬צאצאים של ‪,y‬‬
‫ולכן ) ‪ .f (y) = max{f (y)|y ∈ C 0 } = f (C 0‬נשים לב שאין קשת מ־ ‪ C 0‬ל־‪) C‬שכן אחרת היה מעגל בגרף ‪ ,(GSCC‬לכן‬
‫)‪ .f (y) < d(C‬סך הכל קיבלנו כי )‪ ,f (C 0 ) = f (y) < d(C) < f (C‬ובפרט )‪ ,f (C 0 ) < f (C‬כדרוש‪.‬‬

‫למה ‪ 5.7‬יהיו ‪ C, C 0‬שני רק”חים של )‪ G = (V, E‬כך ש־ ‪ .C 6= C 0‬אם יש קשת ‪ (u, v) ∈ E T‬מ־‪ u‬ל־‪ v‬כך ש־ ‪ u ∈ C, v ∈ C 0‬אזי‬
‫) ‪.f (C) < f (C 0‬‬

‫הוכחה‪ :‬זו בדיוק אותה למה כמו קודם‪ ,‬בניסוח אחר )השתמשנו ב־ ‪ E T‬במקום ב־‪ E‬והפכנו את אי השיוויון(‪.‬‬

‫משפט ‪ 5.8‬העצים ביער ה־‪ DFS‬של אלגוריתם ‪ SCC‬הם רק”חים של ‪.G‬‬


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

‫טריוויאלי‪ ,‬שכן כאשר נוצרו ‪ 0‬עצים‪ ,‬הרי שכל העצים הם רק”חים )באופן ריק(‪.‬‬ ‫בסיס‪:‬‬
‫נניח שנוצרו ‪ n + 1‬עצים‪ .‬מהנחת האינדוקציה‪ ,‬כאשר נוצרו ‪ n‬העצים הראשונים‪ ,‬הם היו כולם רק”חים‪ ,‬נסמנם ב־‬ ‫צעד‪:‬‬
‫‪.C1 , C2 , ..., Cn‬‬
‫נסמן ב־‪ u‬את שורש העץ ה־‪) n + 1‬את הצומת שאיתו קראנו ל־‪ DFS-VISIT‬בפעם ה־‪ .(n + 1‬מתקיים כי ‪ u ∈ C‬כך‬
‫ש־‪ C‬רק”ח כלשהו )ששונה כמובן מ־‪ n‬הראשונים(‪.‬‬
‫‪n‬‬
‫∈ ‪) f (u) = max{f (x)|x‬כלומר הצומת בעל זמן הסיום המקסימלי‬
‫מהגדרת האלגוריתם‪ u ,‬נבחר כך שמתקיים } ‪/ ∪ Ci‬‬
‫‪i=1‬‬
‫מבין אלו שנותרו(‪ .‬כיוון שכל הצמתים ברק”ח ‪ C‬עדיין לא חלק מיער ה־‪ ,DFS‬הרי שמתקיים )‪ .f (u) = f (C‬כמו כן‪,‬‬
‫∈ ‪ ,u‬וכן ש־) ‪ ,f (u) ≥ f (C 0‬לכן בפרט ) ‪ ,f (u) > f (C 0‬וקיבלנו כי‬
‫לכל רק”ח אחר‪ ,C 0 ,‬שעוד לא גילינו‪ ,‬מתקיים ש־ ‪/ C 0‬‬
‫) ‪.f (C) > f (C 0‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪T‬‬
‫מהלמה‪ ,‬אם יש קשת ב־ ‪ E‬בין שני רק”חים שונים ‪ C, C‬אזי ) ‪ ,f (C) < f (C‬ולכן אם ) ‪ ,f (C) > f (C‬אזי לא ייתכן‬
‫שיש קשת כזו‪ ,‬ומכאן שהעץ שיתקבל הוא רק”ח )החיפוש לא יכול לעבור לרק”ח אחר‪ ,‬שכן אין קשת שמחברת ביניהם‪,‬‬
‫אבל כן יחשוף את כל הצמתים ברק”ח הנוכחי‪ ,‬שכן קיים מסלול מכל צומת ברק”ח לכל צומת אחר באותו רק”ח(‪.‬‬

‫‪17‬‬
‫‪ (Minimum‬־ פרק ‪ 23‬בספר‬ ‫עצים פורשים מינימליים )‪Spanning Trees‬‬ ‫‪6‬‬
‫הגדרה ‪ 6.1‬עץ פורש בגרף לא מכוון הוא קבוצת קשתות קשירה חסרת מעגלים המחברת את כל הצמתים‪.‬‬

‫הגדרה ‪ 6.2‬בגרף )‪ G = (V, E‬לא מכוון נאמר שקבוצת קשתות ‪ T ⊆ E‬היא קשירה ⇒⇐ קבוצת הצמתים‬
‫} ‪ VT = {u|∃v ∈ V. (u, v) ∈ T‬היא קשירה ⇒⇐ יש מסלול בגרף בין כל זוג צמתים ב־ ‪.VT‬‬
‫‪P‬‬
‫= ) ‪) w(T‬כך ש־)‪ w(u, v‬הוא משקל הקשת )‪.((u, v‬‬ ‫הגדרה ‪ 6.3‬משקל של קבוצת קשתות ‪ T‬מוגדר באופן הבא‪w(u, v) :‬‬
‫‪(u,v)∈T‬‬

‫הגדרה ‪ 6.4‬לעץ פורש בעל משקל מינימלי נקרא עץ פורש מינימלי‪ ,‬או בקיצור‪ ,‬עפ”מ‪.‬‬

‫הערה ‪ 6.5‬לדוגמה‪ ,‬קבוצת הקשתות האפורות בגרף הבא מהווה עץ פורש מינימלי של הגרף‪:‬‬

‫נשים לב שגם אילו היינו מחליפים את הקשת )‪ (b, c‬בקשת )‪) (a, h‬אשר לשתיהן משקל ‪ (8‬היינו מקבלים עץ פורש בעל משקל‬
‫מינימלי‪ ,‬ומכאן שעפ”מ הוא לא בהכרח יחיד‪.‬‬

‫‪(Generic‬‬ ‫האלגוריתם הגנרי )‪MST‬‬ ‫‪6.1‬‬


‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪6.1.1‬‬
‫נבנה קבוצת קשתות ‪ A‬המקיימת את השמורה הבאה‪ :‬לפני כל איטרציה‪ A ,‬היא תת־קבוצה של עפ”מ כלשהו‪ .‬בכל איטרציה נוסיף‬
‫ל־‪ A‬קשת )‪ (u, v‬שתקיים את השמורה‪ .‬כלומר גם })‪ A ∪ {(u, v‬היא תת־קבוצה של עפ”מ כלשהו‪ .‬נקרא לקשת כזו בטוחה ביחס‬
‫ל־‪ .A‬השאלה האמיתית היא ”איך נמצא קשת בטוחה?” ועליה נענה כשנגיע לאלגוריתמים הספציפיים‪.‬‬

‫האלגוריתם‬ ‫‪6.1.2‬‬

‫הוכחת נכונות‬ ‫‪6.1.3‬‬


‫הוכחה‪ :‬נוכיח שהאלגוריתם הנ”ל אכן מחזיר עפ”מ‪.‬‬
‫)שורה ‪ (1‬מתקיים ∅ = ‪ ,A‬וזו מקיימת את השמורה‪.‬‬ ‫אתחול‪:‬‬

‫בכל חזרה על שורות ‪4‬־‪ 2‬הוספנו קשת בטוחה‪ ,‬לכן מתקיימת השמורה‪.‬‬ ‫איטרציה‪:‬‬
‫‪ A‬היא עץ פורש וכל קשתותיו שייכות לעפ”מ ⇐ ‪ A‬היא עפ”מ‪.‬‬ ‫סיום‪:‬‬

‫הגדרה ‪ 6.6‬חתך בגרף )‪ G = (V, E‬הוא חלוקה של הצמתים לשתי קבוצות‪.(S, V \S) :‬‬

‫הגדרה ‪ 6.7‬קשת )‪ (u, v‬חוצה את החתך אם ‪ u‬ו־‪ v‬נמצאים בצדדים שונים של החתך )למשל ‪ u‬ב־‪ S‬ו־‪ v‬ב־ ‪.(S\V‬‬

‫‪18‬‬
‫הגדרה ‪ 6.8‬עבור קבוצת קשתות ‪ A‬נאמר שחתך )‪ (S, V \S‬מכבד את ‪ A‬אם אין אף קשת חוצה ששייכת ל־‪.A‬‬

‫הערה ‪ 6.9‬לדוגמה‪ ,‬החלוקה הבאה היא חתך ב־‪:G‬‬

‫נשים לב שניתן לצייר מחדש את הגרף )איור )‪ ((a‬כך שקשתות ‪ S‬בצד אחד‪ ,‬וקשתות ‪ S\V‬בצד שני )כפי שנראה באיור )‪,((b‬‬
‫ואז קל מאוד להבחין בקשתות החוצות‪.‬‬
‫כמו כן‪ ,‬נשים לב שהקשתות )‪ (b, c), (c, d‬שהיו בקבוצת הקשתות מהדוגמה הקודמת )היו אפורות(‪ ,‬נסמנה ב־‪ ,A‬הן קשתות חוצות‬
‫בחתך זה‪ ,‬כך שהחתך לא כיבד את ‪ .A‬לעומת זאת‪ ,‬עבור קבוצת הקשתות האפורות באיור הנ”ל‪ ,‬נסמנה ב־‪ ,B‬מתקיים כי החתך‬
‫מכבד את ‪.B‬‬

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

‫משפט ‪) 6.11‬משפט ‪ (1‬יהי )‪ G = (V, E‬גרף לא מכוון עם משקלות ממשיים ‪ w‬לקשתות‪ .‬תהי ‪ A ⊆ E‬המוכלת בעפ”מ כלשהו‪ .‬ויהי‬
‫)‪ (S, V \S‬חתך המכבד את ‪ .A‬אזי כל קשת חוצה קלה היא בטוחה ביחס ל־‪.A‬‬
‫הוכחה‪ :‬יהי ‪ T‬עפ”מ שמכיל את ‪) A‬כלומר ‪ (A ⊆ T ⊆ E‬ותהי )‪ (u, v‬קשת קלה בחתך שמכבד את ‪ .A‬אם ‪ (u, v) ∈ T‬אז‬
‫∈ )‪ .(u, v‬נראה שקיים עפ”מ ‪ T 0‬כך ש־ ‪ .A ∪ {(u, v)} ⊆ T 0‬מכך‬
‫‪ ,A ∪ {(u, v)} ⊆ T‬לכן )‪ (u, v‬קשת בטוחה וסיימנו‪ .‬נניח כי ‪/ T‬‬
‫ינבע ש־)‪ (u, v‬בטוחה ביחס ל־‪.A‬‬
‫∈ )‪ (u, v‬הרי שב־})‪ T ∪ {(u, v‬יש מעגל )שכן ‪ T‬עץ פורש‪ ,‬ו־)‪ (u, v‬קשת שאיננה בעץ כך שהוספתה תסגור‬ ‫נשים לב שאילו ‪/ T‬‬
‫מעגל(‪ .‬נתבונן באיור הבא‪:‬‬

‫ידוע שקשת )‪ (u, v‬היא קשת חוצה )קלה ⇐ חוצה(‪ ,‬אזי ‪ u, v‬בצדדים שונים בחתך‪ ,‬לכן המסלול מ־‪ u‬ל־‪ v‬ב־ ‪) T‬יש מסלול אחד‬
‫∈ )‪) (x, y‬כי )‪ (x, y‬חוצה‪ ,‬ונתון‬
‫בדיוק כזה כי ‪ T‬עפ”מ( כולל קשת חוצה אחת לפחות‪ .‬תהי )‪ (x, y‬קשת חוצה כנ”ל‪ .‬מתקיים ‪/ A‬‬
‫כי החתך מכבד את ‪ ,A‬לכן זו לא קשת ב־‪ .(A‬מכך ש־)‪ (u, v‬קשת קלה‪ ,‬נובע כי )‪ .w(u, v) ≤ w(x, y‬כיוון ש־)‪ (x, y‬על המסלול‬
‫‪ u‬ב־ ‪ ,T‬הורדת )‪ (x, y‬מ־ ‪ T‬שוברת את ‪ T‬לשני רכיבי קשירות‪ ,‬והוספת )‪ (u, v‬מחברת אותם חזרה לעץ פורש חדש‪ ,‬שנסמנו‬ ‫‪v‬‬
‫‪ .T 0‬כלומר‪.T 0 = (T \{(x, y)}) ∪ {(u, v)} :‬‬

‫‪19‬‬
‫ברור ש־ ‪ T 0‬מהווה עץ פורש )היא עץ כי מחקנו קשת מהמעגל היחיד שנוצר כשהוספנו את )‪ ,(u, v‬וכן היא עץ פורש כיוון שאילו‬
‫‪ ,x‬אז ברור שקיים גם מסלול מכל צומת‬ ‫היה מסלול מכל צומת לכל צומת לפני החלפת הקשתות‪ ,‬ולאחר ההחלפה קיים מסלול ‪y‬‬
‫לכל צומת אחר בגרף לאחר ההחלפה(‪.‬‬
‫נראה ש־ ‪ T 0‬הוא עפ”מ‪:‬‬

‫) ‪w(T 0 ) = w(T ) + w(u, v) − w(x, y) ≤ w(T‬‬

‫מכאן שלמעשה מתקיים ) ‪) w(T 0 ) = w(T‬שכן ‪ T‬עפ”מ‪ ,‬כך שלא ייתכן כי ) ‪ ,(w(T 0 ) < w(T‬ולכן גם ‪ T 0‬עפ”מ‪.‬‬
‫∈ )‪ ,(x, y‬לכן ‪) A ⊆ T 0‬כי הקשת היחידה שמוחקים מ־ ‪ T‬לקבלת‬ ‫נראה ש־)‪ (u, v‬בטוחה ביחס ל־‪ :A‬נתון ‪ .A ⊆ T‬הראינו ‪/ A‬‬
‫‪ T 0‬היא קשת שאיננה ב־‪ .(A‬מכאן ש־ ‪ ,A ∪ {(u, v)} ⊆ T 0‬וכיוון ש־ ‪ T 0‬עפ”מ קיבלנו כי )‪ (u, v‬בטוחה ביחס ל־‪ ,A‬כדרוש‪.‬‬

‫מסקנה ‪ 6.12‬יהי )‪ G = (V, E‬גרף קשיר‪ ,‬לא מכוון וממושקל‪ .‬תהי ‪ A ⊆ E‬קב' קשתות המוכלת בעפ”מ כלשהו‪ ,‬ויהי ) ‪C = (VC , EC‬‬
‫רכיב קשירות ביער )‪ A) GA = (V, A‬מוכלת בעץ‪ ,‬לכן בפרט )‪ GA = (V, A‬הוא עץ או יער(‪ .‬תהי )‪ (u, v‬קשת קלה המחברת את‬
‫‪ C‬לרכיב קשירות אחר ב־ ‪) GA‬כלומר קשת קלה ביחס לחתך ) ‪ ,((VC , V \VC‬אזי )‪ (u, v‬היא בטוחה ביחס ל־‪.A‬‬
‫הוכחה‪) :‬הוכחת המסקנה( החתך ) ‪ (VC , V \VC‬מכבד את ‪ A‬והקשת )‪ (u, v‬קלה ביחס לחתך‪ ,‬לכן ממשפט ‪ 1‬נובע כי )‪ (u, v‬בטוחה‬
‫ביחס ל־‪.A‬‬

‫האלגוריתם של קרוסקל )‪(MST-Kruskal‬‬ ‫‪6.2‬‬


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

‫מבנה הנתונים שנשתמש בו‬ ‫‪6.2.2‬‬


‫נשתמש במבנה נתונים לתחזוקה של קבוצות זרות ־ ‪ .union-nd‬מבנה זה תומך בפעולות‪:‬‬
‫)‪ M akeSet(x‬יצירת קבוצה המכילה את האיבר היחיד ‪.x‬‬
‫)‪ F indSet(x‬מחזיר את הנציג של הקבוצה המכילה את ‪.x‬‬
‫?‬
‫מאפשר בדיקה האם ‪ x‬ו־‪ y‬באותה קבוצה ע”י )‪.F indSet(x) = F indSet(y‬‬
‫)‪ U nion(x, y‬מאחד את הקבוצות של ‪ x‬ו־‪.y‬‬

‫יש כמה מימושים אפשריים‪:‬‬


‫‪ .1‬מימוש שבו ‪ m‬פעולות‪ ,‬מהן ‪ n‬פעולות ‪ M akeSet‬ידרשו עבודה של )‪.O(m + nlogn‬‬
‫‪ .2‬מימוש יעיל יותר שבו ‪ m‬פעולות‪ ,‬מהן ‪ n‬פעולות ‪ M akeSet‬ידרשו עבודה של ))‪ α) O(mα(n‬היא הפונקציה ההופכית לפונקציית‬
‫אקרמן‪ .‬היא מונטונית עולה‪ ,‬אבל עולה כל כך לאט שמקבלים ‪ α(n) ≤ 5‬לכל מספר בקנה מידה הגיוני‪ ,‬כמו נגיד מספר‬
‫האטומים ביקום(‪.‬‬

‫אנחנו נשתמש במימוש השני‪.‬‬

‫האלגוריתם‬ ‫‪6.2.3‬‬

‫‪20‬‬
‫דוגמת הרצה‬ ‫‪6.2.4‬‬

‫ניתוח סיבוכיות‬ ‫‪6.2.5‬‬


‫• אתחול )שורות ‪3‬־‪ :(1‬בניית ∅ = ‪ A‬ב־)‪ ,O(1‬בניית | ‪ |V‬קבוצות באמצעות ‪.M akeSet‬‬
‫• מיון הקשתות )שורה ‪ :(4‬דורש ))|‪O(|E|log(|E‬‬
‫• לולאה )שורות ‪8‬־‪:(5‬‬
‫– )|‪ O(|E‬פעולות ‪.F indSet‬‬
‫– )| ‪ O(|V‬פעולות ‪.U nion‬‬
‫הגרף קשיר‪ ,‬לכן )|‪ ,|V | = O(|E‬כך שיש לנו )|‪ O(|E‬פעולות סך הכל‪.‬‬

‫‪21‬‬
‫סך הכל‪ ,‬כל השלבים למעט המיון דורשים ))| ‪ ,O(|E|α(|V‬והמיון דורש ))|‪ ,O(|E|log(|E‬לכן הסיבוכיות הכוללת היא ))|‪.O(|E|log(|E‬‬
‫כמו כן‪ ,‬כיוון ש־ ‪ ,|E| ≤ |V2 | < |V |2‬מתקיים )| ‪ ,log(|E|) = O(log(|V |2 ) = O(2log(|V |) = O(log|V‬לכן הסיבוכיות הכוללת‬
‫‬

‫היא ))| ‪.O(|E|log(|V‬‬

‫האלגוריתם של פרים )‪(MST-Prim‬‬ ‫‪6.3‬‬


‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪6.3.1‬‬
‫מאתחלים קבוצה ‪ A‬ריקה‪ .‬בוחרים צומת שרירותי ‪ r‬שיהיה שורש העץ הפורש ומגדירים לו מפתח ‪ .0‬כמו כן‪ ,‬לכל שאר הצמתים‬
‫בגרף מגדירים מפתחות בעלי משקל אינסופי‪ ,‬ומכניסים אותם לתור עדיפויות מסוג מינימום המבוסס על מפתחות אלו‪.‬‬
‫בכל שלב שולפים צומת ‪ u‬מהתור )מהאופן בו הגדרנו את המפתחות בהתחלה‪ ,‬נקבל כי הצומת הראשון שישלף יהיה ‪ .(r‬כעת‪,‬‬
‫לכל שכן ‪ v‬של ‪ u‬נפעל באופן הבא‪:‬‬
‫• אם משקל הצומת )‪ (u, v‬קטן מהמפתח הנוכחי של ‪:v‬‬
‫– נעדכן את המפתח של ‪ v‬להיות )‪) w(u, v‬כלומר נגדיר )‪.(v.key = w(u, v‬‬
‫– נעדכן את האב של ‪ v‬להיות ‪) u‬כלומר נגדיר ‪(v.π = u‬‬
‫• אחרת‪ ,‬נמשיך לשכן הבא‪.‬‬
‫בכל פעם שנשלוף צומת ‪ u‬נוסף מהתור‪ ,‬הוא בהכרח יהיה שכן של אחד הצמתים שכבר עברנו עליהם‪ ,‬כך שהוספת הקשת )‪(u, u.π‬‬
‫ל־‪ A‬מהווה למעשה הוספת קשת קלה המחברת בין ‪ A‬לבין איזשהו צומת מבודד ב־)‪ ,GA = (V, A‬ומכאן שזו קשת בטוחה ביחס‬
‫ל־‪ .A‬כאשר התור יתרוקן‪ ,‬ועברנו על כל הצמתים‪ ,‬נקבל ש־‪ A‬היא עץ פורש מינימלי ונסיים‪.‬‬

‫מבנה הנתונים שנשתמש בו‬ ‫‪6.3.2‬‬


‫נשתמש בתור עדיפויות מסוג מינימום )‪ (Minimum Priority Queue‬שיסומן ב־‪ Q‬התומך בפעולות‪:‬‬
‫)‪ ExtarctM in(Q‬שולפת את האיבר עם המפתח המינימלי מהתור‪.‬‬
‫)‪ Insert(Q, x‬הוספת האיבר ‪ x‬לתור‪.‬‬
‫)‪ DecreaseKey(Q, x, k‬מפחיתה ‪ k‬מהמפתח של ‪.x‬‬
‫בנוסף‪ ,‬לכל צומת ‪ v ∈ V‬נגדיר‪:‬‬
‫המשקל המינימלי הנוכחי של קשת המחברת את ‪ v‬לעץ הנוכחי )ויהיה ∞ אם אין שום קשת שמחברת אותם(‪ .‬ישמש‬ ‫‪v.key‬‬
‫אותנו כמפתח של תור העדיפויות‪.‬‬
‫האב של כל צומת בעץ )כלומר דרך איזה צומת הגענו ל־‪ v‬כשחיברנו אותו לעץ(‪ ,‬יאותחל ל־‪.N IL‬‬ ‫‪v.π‬‬

‫האלגוריתם‬ ‫‪6.3.3‬‬

‫הערה ‪ 6.13‬האלגוריתם מקיים את השמורות )ומהן נובעת נכונותו(‪:‬‬


‫‪) A = {(v, v.π)|v ∈ (V \{r})\Q} .1‬לא מחזיקים את קבוצה ‪ A‬במפורש באלגוריתם‪ ,‬אבל ככה היא מוגדרת(‬
‫‪ .2‬הצמתים שכבר בעפ”מ הם ‪) V \Q‬כלומר אלו שעוד לא הוצאנו מהתור(‬

‫‪22‬‬
‫‪ .3‬לכל צומת ‪ v ∈ Q‬אם ‪ v.π 6= N IL‬אז ∞ < ‪ ,v.key‬וכן ‪ v.key‬הוא המשקל המינימלי של קשת בין ‪ v‬לבין צומת שכבר בעץ‪.‬‬
‫)הסבר‪ :‬שורה ‪ 7‬מזהה ‪ u ∈ Q‬שנשען על קשת קלה בחתך )‪ (V \Q, Q‬שמכבד את ‪ .A‬הוצאת ‪ u‬מ־‪ Q‬מוסיפה אותו ל־‪,V \Q‬‬
‫וכך נוספת ל־‪ A‬הקשת )‪ .(u, u.π‬הלולאה בשורות ‪11‬־‪ 8‬מעדכנת את ‪ key, π‬לכל שכן של ‪ u‬שלא בעץ‪ ,‬ומכאן ששמורה זו אכן‬
‫נשמרת‪(.‬‬

‫דוגמת הרצה‬ ‫‪6.3.4‬‬

‫ניתוח סיבוכיות‬ ‫‪6.3.5‬‬


‫לצורך בדיקת השייכות ל־‪ Q‬נשמור וקטור ביטים באורך | ‪ ,|V‬כך שכל ביט יסמן האם הצומת שייך ל־‪ Q‬או לא‪ .‬בכל פעם שנבצע‬
‫‪ ExtractM in‬נעדכן את הוקטור )ב־)‪ O(1‬לכל עדכון‪ ,‬ולכן ב־)| ‪ O(|V‬סך הכל(‪.‬‬
‫הסיבוכיות תלויה במימוש של תור העדיפויות‪ .‬נשים לב שבשורה ‪ 7‬מבצעים ‪ ExtractM in‬וכן בשורה ‪ 11‬מבצעים ‪DecreaseKey‬‬
‫)כאשר מעדכנים את המפתח של צומת ‪ .(v‬נבחן את האפשרויות‪:‬‬

‫אצלנו‬ ‫במקרה הכללי‬


‫ערימת פיבונאצ'י‬ ‫ערימה בינארית‬ ‫‪#‬פעולות‬ ‫ערימת פיבונאצ'י‬ ‫ערימה בינארית‬
‫)| ‪O(|V‬‬ ‫))| ‪O(|V |log(|V‬‬ ‫)| ‪O(|V‬‬ ‫)‪O(1‬‬ ‫))‪O(log(n‬‬ ‫‪Insert‬‬
‫))| ‪O(|V |log(|V‬‬ ‫))| ‪O(|V |log(|V‬‬ ‫)| ‪O(|V‬‬ ‫))‪O(log(n‬‬ ‫))‪O(log(n‬‬ ‫‪ExtractMin‬‬
‫)|‪O(|E‬‬ ‫))| ‪O(|E|log(|V‬‬ ‫)|‪O(|E‬‬ ‫‪O(1) amortized‬‬ ‫))‪O(log(n‬‬ ‫‪DecreaseKey‬‬
‫))| ‪O(|E| + |V |log(|V‬‬ ‫))| ‪O(|E|log(|V‬‬ ‫‪Total‬‬
‫נבחר להשתמש בערימת פיבונאצ'י‪ ,‬כך שהסיבוכיות הכוללת של אלגוריתם פרים תהיה ))| ‪ O(|E|+|V |log(|V‬לעומת ))| ‪O(|E|log(|V‬‬
‫של אלגוריתם קרוסקל‪.‬‬

‫‪23‬‬
‫‪ (Dynamic‬־ פרק ‪ 15‬בספר‬ ‫תכנון דינאמי )‪Programming‬‬ ‫‪7‬‬
‫הקדמה‬ ‫‪7.1‬‬
‫בהקשר של ‪ Dynamic Programming‬המילה ‪ Programming‬מתייחסת לתכנון )ולא לתכנות(‪ .‬זה מושג שנוצר בתקופת מלחמת‬
‫העולם השניה בתחום חקר ביצועים )שנעשה לאופטימיזציה של תהליכים שעירבו נתונים רבים כגון הובלה‪ ,‬הפצצה ועוד(‪ .‬השיטה‬
‫שזכתה לשם תכנון דינאמי פותחה ע”י ‪ ,Richard Bellman‬והיא אינה מתייחסת לאלגוריתם אחד ספציפי‪ ,‬כפי שראינו עד כה‪ ,‬אלא‬
‫לשיטה כללית‪ ,‬שנותנת פתרון לסוג מסוים של בעיות‪ .‬כיוון שמדובר במטה־שיטה‪ ,‬ולא באלגוריתם ספציפי‪ ,‬נלמד אותה באמצעות‬
‫הצגת מספר דוגמאות‪.‬‬

‫הגדרה ‪ 7.1‬תת־מבנה של אופטימליות )‪ (Suboptimality structure‬־ נאמר שבעיה היא בעלת תת־מבנה של אופטימליות אם‬
‫הפתרון האופטימלי לבעיה מכיל בתוכו פתרונות אופטימליים לתתי בעיות‪.‬‬

‫דוגמה ‪ 1‬־ תכנון פס ייצור‬ ‫‪7.2‬‬

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

‫נסמן‪:‬‬
‫תחנה ‪ j‬בפס ‪i‬‬ ‫‪Si,j‬‬

‫זמן ייצור שלב ‪ j‬בפס ‪i‬‬ ‫‪ai,j‬‬


‫זמן כניסה לתחנה ‪ 1‬בפס ‪i‬‬ ‫‪ei‬‬
‫זמן יציאה מתחנה ‪ n‬בפס ‪i‬‬ ‫‪xi‬‬
‫זמן העברה אחרי תחנה ‪ Si,j‬לפס השני‬ ‫‪ti,j‬‬

‫המטרה‪ :‬מצאו תהליך יצור בזמן כולל מינימלי‪ ,‬עבור הנתונים הבאים‪:‬‬

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

‫• אם ‪ :j = 1‬יש אפשרות אחת למסלול בעל זמן עבודה קצר ביותר עד שלב זה‪.‬‬
‫• אם ‪ :j > 1‬התחנה הקודמת היא ‪ S1,j−1‬או ‪.S2,j−1‬‬
‫– אם התחנה הקודמת היא ‪ :S1,j−1‬חייבים להגיע אליה במסלול המהיר ביותר מההתחלה אל ‪) S1,j−1‬שכן ‪ Si,j‬הוא‬
‫אופטימלי‪ ,‬לכן תת־המסלול אל ‪ S1,j−1‬הוא חלק ממסלול אופטימלי‪ .‬אילו תת־המסלול לא היה אופטימלי בעצמו‪ ,‬זה‬
‫אומר שיש תת־מסלול כנ”ל קצר יותר‪ ,‬ואם נחליף ביניהם נקבל מסלול קצר יותר עד ‪ ,Si,j‬כך שהמסלול הנוכחי עד ‪Si,j‬‬
‫לא היה אופטימלי‪ ,‬בסתירה להנחה(‪.‬‬
‫– אם התחנה הקודמת היא ‪ :S2,j−1‬חייבים להגיע אליה במסלול המהיר ביותר מההתחלה אל ‪.S2,j−1‬‬

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

‫נסמן‪:‬‬
‫הזמן המינימלי לפתרון מההתחלה ועד לתחנה ‪.Si,j‬‬ ‫‪fi,j‬‬
‫הזמן המינימלי לבעיה כולה‪.‬‬ ‫∗‪f‬‬

‫כך שמתקיים‪:‬‬

‫) ‪f ∗ = min(f1,n + x1 , f2,n + x2‬‬


‫‪f1,1 = e1 + a1,1‬‬
‫‪f2,1 = e2 + a2,1‬‬
‫) ‪f1,j = min(f1,j−1 + a1,j , f2,j−1 + t2,j−1 + a1,j‬‬
‫) ‪f2,j = min(f2,j−1 + a2,j , f1,j−1 + t1,j−1 + a2,j‬‬

‫חישוב רקורסיבי‪:‬‬
‫נסמן‪:‬‬
‫מספר הקריאות ל־ ‪fi,j‬‬ ‫‪ri,j‬‬
‫אם נתחיל מהסוף‪ ,‬ובכל פעם נמצא את הזמן האופטימלי של תתי המסלולים‪ ,‬כמה פעמים אנחנו קוראים ל־ ‪ fi,j‬בפתרון הבעיה?‬

‫‪r1,n = r2,n = 1‬‬


‫‪r1,j = r2,j = r1,j−1 + r2,j−1‬‬

‫הפתרון לזה הוא ) ‪ ,Ω(2n‬כך שזה לא עולה פחות מפשוט לנסות את כל האפשרויות‪ .‬לא טוב‪...‬‬
‫לחילופין ־ נחשב בסדר עולה של מספרי התחנה‪ ,‬שכן פתרון עבור ‪ Si,j‬תלוי רק בפתרונות עבור ‪.S1,j−1 , S2,j−1‬‬
‫את החישוב מבצעים כפי שנראה בטבלאות )איור )‪ ((b‬־ בכל שלב מחשבים את המינימום בין שני אורכי המסלול שיתקבלו מכל‬
‫אחת משתי האפשרויות של תתי המסלול ‪ S1,j−1 , S2,j−1‬שכבר חישבנו‪.‬‬

‫‪25‬‬
‫ניתוח סיבוכיות‪:‬‬
‫לכל זוג ‪ i, j‬אנחנו צריכים לבצע ‪ 2‬חישובים )אחד לכל אפשרות למצב הקודם ממנו הגענו(‪ ,‬לכן סך הכל נעשה )‪ O(n‬חישובים‪ .‬כמו‬
‫כן‪ ,‬כיוון שצריך לשמור רק את שני הפתרונות לתתי־הבעיות הקודמות )עבור האפשרויות משלב ‪ (j − 1‬בכל שלב‪ ,‬נצטרך )‪ O(1‬מקום‪,‬‬
‫ואם נשמור גם את הקודם במסלול )הטבלה הימנית מבין השתיים באיור )‪ ((b‬על מנת שנוכל להרכיב בסוף את המסלול האופטימלי‬
‫בפס הייצור‪ ,‬נצטרך סך הכל )‪ O(n‬מקום‪.‬‬

‫דוגמה ‪ 2‬־ כפל סדרת מטריצות‬ ‫‪7.3‬‬


‫נתונה סדרת מטריצות ‪) A1 , A2 , A3 , A4 , A5‬הנחה‪ :‬כפל מטריצות במימדים )‪ (a × b)(b × c‬עולה ‪.(a × b × c‬‬
‫}‪|{z} |{z} |{z} |{z} |{z‬‬
‫‪p0 ×p1 p1 ×p2 p2 ×p3 p3 ×p4 p4 ×p5‬‬
‫ידוע שכפל מטריצות הוא אסוציאטיבי‪ ,‬כך שניתן לבצע את המכפלה באיזה סדר שנרצה )למשל‬
‫) ‪.((A1 × A2 ) × (A3 × A4 ) = A1 × ((A2 × A3 ) × A4‬‬
‫חשוב לשים לב כי הדרך שבה נבחר להציב את הסוגריים בפעולת המכפלה יכולה להשפיע באופן דרמטי על מספר הפעולות‬
‫הדרושות לחישוב המכפלה‪.‬‬
‫נדגים זאת באמצעות סדרת מטריצות קצרה‪ .‬נקח ‪ A1 , A2 , A3‬־ יש שתי אפשרויות לחישוב‪:‬‬
‫}‪|{z} |{z} |{z‬‬
‫‪10×100 100×5 5×50‬‬

‫• ‪ (A1 × A2 ) × A3‬־ העלות תהיה‪(p0 × p1 × p2 ) + (p0 × p2 × p3 ) = 10 × 100 × 5 + 10 × 5 × 50 = 7, 500 :‬‬

‫• ) ‪ A1 × (A2 × A3‬־ העלות תהיה‪(p1 × p2 × p3 ) + (p0 × p1 × p3 ) = 100 × 5 × 50 + 10 × 100 × 50 = 75, 000 :‬‬
‫ניתן לראות אם כן שלסדר בו אנו כופלים את המטריצות יש השפעה גדולה על מספר הפעולות הדרושות לחישוב המכפלה על סדרת‬
‫המטריצות‪.‬‬
‫המטרה‪ :‬נתון וקטור מימדים ‪ .p0 , p1 , p2 , ..., pn‬מצאו סדר כפל מטריצות אופטימלי עבור מט' במימדים אלו‪.‬‬
‫‪n‬‬
‫‪4‬‬
‫)‪) Ω( (n−1‬למעוניינים‪ ,‬הפתרון של זה נובע מפתרון נוסחת נסיגה‬‫הערה ‪ 7.3‬מספר האופנים האפשריים לכפל ‪ n‬מטריצות הוא ) ‪3/2‬‬

‫של מספרי קאטאלן(‪ ,‬כלומר אקספוננציאלי ב־‪ ,n‬לכן בדיקת כל האפשרויות היא לא פתרון טוב‪.‬‬

‫פתרון‪:‬‬
‫נסמן‪:‬‬
‫המטריצה המתקבלת מהמכפלה ‪.Ai × Ai+1 × ... × Aj‬‬ ‫‪Ai...j‬‬

‫על מנת למצוא פתרון לבעיה‪ ,‬ננסה לאפיין את התכונות של המכפלה האופטימלית‪ .‬עבור המכפלה ‪ Ai...j‬אם החלוקה‬
‫) ‪ (Ai...k ) × (Ak+1...j‬היא אופטימלית‪ ,‬אז גם הסדר הפנימי של המכפלה ) ‪ (Ai...k‬הוא אופטימלי )בסופו של דבר‪ ,‬לכל סידור פנימי‬
‫המטריצה המתקבלת מהמכפלה ‪ Ai...k‬היא זהה‪ ,‬ובפרט בעלת אותם מימדים‪ .‬לכן אילו הסידור עבור ‪ Ai...k‬לא היה אופטימלי‪ ,‬היה‬

‫‪26‬‬
‫סידור אחר‪ ,‬טוב יותר‪ ,‬כך שהיינו יכולים להשתמש בו במכפלה ‪ Ai...j‬ולקבל מספר פעולות כולל קטן יותר‪ ,‬בסתירה לכך שהחלוקה‬
‫) ‪ (Ai...k ) × (Ak+1...j‬היא אופטימלית(‪.‬‬
‫כלומר בסדר אופטימלי על ‪ ,Ai...j‬אם נקודת הפירוק היא ‪ k‬אזי גם ‪ Ai...k‬חייב להיות בסדר אופטימלי‪ ,‬וכן גם ‪ Ak+1...j‬חייב‬
‫להיות בסדר אופטימלי‪ .‬על כן‪ ,‬קיבלנו כי הבעיה היא בעלת תת־מבנה של אופטימליות‪.‬‬

‫נסמן‪:‬‬
‫מספר הפעולות המינ' למכפלה ‪ ,Ai...j‬ונגדיר ‪.mi,i = 0‬‬ ‫‪mi,j‬‬

‫הערך של ‪ k) k‬הוא מיקום החלוקה( שנותן את המינימום עבור ‪.mi,j‬‬ ‫‪Si,j‬‬

‫כך שמתקיים‪:‬‬

‫‪‬‬
‫‪0‬‬ ‫‪i=j‬‬
‫‪mi,j‬‬ ‫=‬
‫‪ min (mi,k + mk+1,j ) + pi−1 × pk × pj‬‬ ‫‪i<j‬‬
‫‪i≤k<j‬‬

‫הערה ‪ min (mi,k + mk+1,j ) 7.4‬הוא מספר הפעולות המינימלי לחישוב מכפלת שני החלקים ) ‪ (Ai...k ), (Ak+1...j‬על פני כל‬
‫‪i≤k<j‬‬
‫החלוקות האפשריות )ערכי ‪ k‬האפשריים(‪ ,‬ו־ ‪ pi−1 × pk × pj‬זו העלות של מכפלת המטריצות ‪. Ai...k × Ak+1...j‬‬
‫} ‪| {z‬‬ ‫} ‪| {z‬‬
‫‪pi−1 ×pk‬‬ ‫‪pk ×pj‬‬

‫חישוב רקורסיבי‪:‬‬
‫גם כאן אם נתחיל מהסוף )כלומר מ־ ‪ ,(m1,n‬ובכל פעם נמצא את הזמן האופטימלי של תתי המכפלות נגיע לפתרון אקספוננציאלי‪.‬‬
‫מתתי המכפלות הקטנות ביותר‪ ,‬ונחשב באמצעותן את כל תתי המכפלות הגדולות יותר‪ ,‬נגיע לפתרון טוב‬ ‫לעומת זאת‪ ,‬אם נתחיל‬
‫יותר‪ .‬יש לנו רק ) ‪ n2 = Θ(n2‬תתי־בעיות לפתור‪ ,‬כיוון שנרצה לדעת מהו מס' הפעולות המינימלי עבור כל זוג אינדקסים ‪) i, j‬כך‬
‫‬

‫ש־‪ .(i < j‬כיוון שבמקרה זה מדובר במספר ריבועי של פתרונות‪ ,‬זה סביר לשמור את כל הפתרונות של תתי־הבעיות )חשוב לשים‬
‫לב שזה לא תמיד המצב!(‪ .‬כמו כן‪ ,‬נוכל באמת להתחיל מפתרון תתי־הבעיות הקטנות‪ ,‬ולפתור באמצעותן את תתי־הבעיות הגדולות‬
‫יותר‪ ,‬כיוון שכל בעיה משתמשת רק בפתרונות של בעיות עם אינטרוול )כלומר |‪ (|i − j‬קטן יותר‪.‬‬

‫האלגוריתם‪:‬‬
‫נחשב את ערכי ‪ mi,j‬בסדר עולה של ערכי ‪) j − i‬מתבטא באלגוריתם הנ”ל בתור ‪ ,l‬אורך סדרת המטריצות(‪ ,‬ולכל זוג ‪ i, j‬נשמור את‬
‫ה־‪ k‬עבורו קיבלנו את הערך המינימלי ל־ ‪.mi,j‬‬

‫לדוגמה‪ :‬עבור המטריצות ‪ A1 , ..., A6‬הבאות נקבל את החלוקה ) ‪ (A1 × (A2 × A3 )) × ((A4 × A5 ) × A6‬כפי שניתן לראות מהחישוב‬
‫הבא‪:‬‬

‫‪27‬‬
‫על מנת להגיע לפירוק האופטימלי‪ ,‬מתחילים מראש הפירמידה ‪ ,S‬ומוצאים את תתי־הפירוקים האופטימליים‪:‬‬
‫• עבור ‪ i = 1, j = 6‬קיבלנו כי ‪ ,k = 3‬לכן הפירוק הוא‪.A1...6 = A1...3 × A4...6 :‬‬
‫• עבור ‪ i = 1, j = 3‬קיבלנו כי ‪ ,k = 1‬לכן הפירוק הוא‪.A1...3 = A1 × A2...3 = A1 × (A2 × A3 ) :‬‬
‫• עבור ‪ i = 4, j = 6‬קיבלנו כי ‪ ,k = 5‬לכן הפירוק הוא‪.A4...6 = A4...5 × A6 = (A4 × A5 ) × A6 :‬‬

‫סך הכל קיבלנו‪.A1...6 = A1...3 × A4...6 = (A1 × (A2 × A3 )) × ((A4 × A5 ) × A6 ) :‬‬

‫ניתוח סיבוכיות‪:‬‬
‫אנחנו צריכים לבצע ) ‪ O(n2‬חישובים של תתי־בעיות‪ ,‬כאשר לכל אחת צריך לבצע את החישוב לכל ערך אפשרי של ‪ ,k‬לכן סך הכל‬
‫ב־) ‪ .O(n3‬כמו כן‪ ,‬כפי שהסברנו קודם‪ ,‬כיוון שצריך לשמור את כל הפתרונות לתתי־הבעיות הקטנות היותר בכל שלב‪ ,‬נצטרך ) ‪O(n2‬‬
‫מקום‪.‬‬

‫של‬ ‫ב־‪Algorithm Design‬‬ ‫־ עימוד סדרות ‪ /‬רצפים )פרק ‪6‬‬ ‫‪Sequence Alignment‬‬ ‫דוגמה ‪ 3‬־‬ ‫‪7.4‬‬
‫‪(KT‬‬
‫כשאנחנו כותבים טקסט עם שגיאות במנוע חיפוש כמו גוגל למשל‪ ,‬הוא יודע לתקן אותנו‪ .‬לדוגמה‪ ,‬אם נכתוב ‪ ,ocurrance‬נקבל‬
‫בתגובה ?‪ .did you mean occurrence‬איך זה עובד? נשים לב שבדוגמה זו‪ ,‬אם נשווה אות־אות‪ ,‬נקבל שישנה גם החלפה )במקום‬
‫‪ a‬אמורה להופיע האות ‪ ,(e‬וגם פער )חסרה ‪ c‬אחת(‪:‬‬

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

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

‫‪abbbaabbbbaab‬‬
‫‪ababaaabbbbbab‬‬

‫‪28‬‬
‫האם העימוד המוצע למטה הוא אופטימלי?‬

‫כאן כבר יותר קשה לקבוע‪.‬‬

‫הגדרה ‪ 7.5‬נתונות שתי מחרוזות ) ‪ x = (x1 ...xm‬ו־) ‪.y = (y1 ...yn‬‬


‫זיווג בין }‪ I = {1, ..., m‬ל־}‪ J = {1, ..., n‬הוא אוסף של זוגות סדורים ) ‪ (ik , jk‬כך ש־‪ ik ∈ I, jk ∈ J‬ללא איברים חוזרים‪.‬‬
‫עימוד הוא זיווג ללא זוגות חוצים )כלומר אם )‪ (i0 , j 0 ), (i, j‬שני זוגות בזיווג‪ ,‬ו־ ‪ i < i0‬אז ‪.(j < j 0‬‬
‫המטרה‪ :‬בהנתן שתי סדרות מעל א”ב ידוע‪ ,‬נרצה למצוא עימוד שנותן מרחק מינימלי בין שתי המילים‪ .‬כמובן שניתן להכליל את‬
‫הבעיה גם למקרה שבו יש משקל שונה להחלפה ופער‪ ,‬וכן משקלים שונים להחלפות שונות‪.‬‬

‫נסמן‪:‬‬
‫קנס לפער‬ ‫‪δ‬‬
‫קנס לעימוד של תו ‪ p‬מול תו ‪) q‬נגדיר בד”כ ‪(αpp = 0‬‬ ‫‪αpq‬‬

‫∈ )‪ (m, n‬אז ‪ xm‬או ‪) yn‬או שניהם( לא נכללים בזיווג‪.‬‬


‫למה ‪ 7.6‬בעימוד ‪ M‬של ) ‪ x = (x1 ...xm‬ו־) ‪ y = (y1 ...yn‬אם ‪/ M‬‬

‫הערה ‪ 7.7‬כאשר אינדקס של תו לא נכלל בזיווג נקבל פער‪ .‬למשל עבור המילים ‪ ,x = stop‬ו־‪ ,y = tops‬העימוד‬
‫})‪ M = {(2, 1), (3, 2), (4, 3‬מיוצג באופן הבא‪:‬‬

‫ניתן לראות ש־‪ i = 1‬לא מופיע בעימוד‪ ,‬כך שקיבלנו פער עבור התו ‪ s‬במילה ‪) stop‬באופן דומה ‪ j = 4‬לא מופיע‪ ,‬וקיבלנו פער‬
‫עבור ‪ s‬במילה ‪.(tops‬‬
‫∈ )‪ (m, n‬ונניח בשלילה ש־ ‪ xm‬ו־ ‪ yn‬שניהם נכללים בזיווג‪ .‬כלומר‪ ,‬יש ‪ i < m, j < n‬כך‬ ‫הוכחה‪) :‬הוכחת הלמה( נניח ‪/ M‬‬
‫ש־ ‪ (i, n) ∈ M‬ו־ ‪ .(m, j) ∈ M‬קיבלנו זוג חוצה‪ ,‬בסתירה להגדרה של עימוד‪.‬‬

‫מסקנה ‪ 7.8‬בעימוד אופטימלי‪ ,‬לפחות אחת מהאפשרויות הבאות נכונה‪:‬‬


‫‪(m, n) ∈ M .1‬‬
‫‪ .2‬עמדה ‪ m‬ב־‪ x‬לא ב־ ‪.M‬‬
‫‪ .3‬עמדה ‪ n‬ב־‪ y‬לא ב־ ‪.M‬‬

‫פתרון‪:‬‬
‫נסמן‪:‬‬
‫המחיר המינימלי של עימוד ) ‪ x = (x1 ...xm‬מול ) ‪.y = (y1 ...yn‬‬ ‫)‪opt(i, j‬‬
‫מהמסקנה‪ ,‬בעימוד אופטימלי‪:‬‬
‫‪ .1‬אם ‪ :(i, j) ∈ M‬נשלם ‪ αxi yj‬ונעמיד את ‪ x1 ...xi−1‬מול ‪.y1 ...yj−1‬‬
‫‪ .2‬אם ‪ i‬לא ב־ ‪ :M‬נשלם ‪ δ‬ונעמיד את ‪ x1 ...xi−1‬מול ‪.y1 ...yj‬‬
‫‪ .3‬אם ‪ j‬לא ב־ ‪ :M‬נשלם ‪ δ‬ונעמיד את ‪ x1 ...xi‬מול ‪.y1 ...yj−1‬‬
‫כך שהמחיר של העימוד האופטימלי יחושב רקורסיבית באופן הבא )‪:(opt(0, 0) = 0‬‬
‫‪‬‬ ‫‪‬‬
‫)‪αxi yj + opt(i − 1, j − 1‬‬
‫‪opt(i, j) = min ‬‬ ‫)‪δ + opt(i, j − 1‬‬ ‫‪‬‬
‫)‪δ + opt(i − 1, j‬‬

‫וכן ‪ (i, j) ∈ M‬בעימוד אופטימלי ⇒⇐ המינימום מתקבל ע”י האפשרות הראשונה‪.‬‬

‫‪29‬‬
‫חישוב רקורסיבי‪:‬‬
‫נוכל לשמור את הערכים של )‪ opt(i, j‬לכל זוג ‪ i, j‬במטריצה בגודל ‪ .m × n‬נשים לב שע”מ לחשב את ערך התא המתאים ל־‪i, j‬‬
‫עלינו למצוא את הערכים המתאימים לזוגות )‪ (i − 1, j) ,(i − 1, j − 1‬ו־)‪ .(i, j − 1‬לכן נוכל להתחיל למלא את המטריצה מהפינה‬
‫השמאלית העליונה‪ ,‬ולהתקדם באלכסון למטה וימינה )כלומר בסדר עולה של ‪ ,(i, j‬כך שבכל פעם שנחשב ערך חדש‪ ,‬יהיו לנו כבר‬
‫הערכים הקודמים הדרושים לחישוב‪.‬‬
‫לדוגמה‪ :‬עבור המילים ‪ name‬ו־‪ ,mean‬נניח את שיטת הקנסות הבאה‪ :‬העלות של פער תהיה ‪ .δ = 2‬כמו כן‪ ,‬עבור התאמה של‬
‫עיצור ועיצור או תנועה ותנועה ‪ ,α = 1‬וכן עבור התאמה של עיצור ותנועה ‪ .α = 3‬נמצא באמצעות מטריצה )כמתואר לעיל(‬
‫את המסלול הקצר ביותר מ־)‪ (0, 0‬לכל זוג )‪:(i, j‬‬

‫שחזור המסלול מ־)‪ (4, 4‬אחורה אל )‪ (0, 0‬ייתן לנו את העימוד האופטימלי‪.‬‬

‫ניתוח סיבוכיות‪:‬‬
‫אנחנו צריכים לבצע )‪ O(mn‬חישובים של תתי־בעיות‪ ,‬וכל אחת תעשה בזמן קבוע בהנתן הערכים של תתי הבעיות הקודמות הדרושות‪,‬‬
‫לכן סך הכל ב־)‪ .O(mn‬בנוגע לסיבוכיות הזכרון‪ ,‬אם נרצה לדעת את הפתרון בלבד )כלומר את המחיר המינימלי של העימוד( נצטרך‬
‫))‪ O(min(m, n‬מקום‪ ,‬אך אם נרצה למצוא את העימוד עצמו‪ ,‬נצטרך )‪ O(mn‬מקום )לידע כללי‪ :‬יש אלגוריתמים יותר מתוחכמים‬
‫שמאפשרים לשחזר את העימוד בסיבוכיות מקום לינארית של )‪ ,O(m + n‬אבל לא נלמד אותם במסגרת הקורס(‪.‬‬

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

‫‪ u‬עם מספר קשתות מקסימלי היא בעלת תת־מבנה של‬ ‫האם גם הבעיה‪ :‬בהנתן שני צמתים ‪ u, v‬בגרף‪ ,‬מצא מסלול פשוט ‪v‬‬
‫אופטימליות?‬
‫התשובה היא שלא‪ .‬למשל בגרף הבא‪:‬‬

‫‪ u‬הארוך ביותר הוא ‪ .u → x → w → v‬לעומת זאת‪ ,‬אילו נחלק את המסלול לתתי מסלולים )למשל ב־‪ ,(w‬ונמצא‬ ‫המסלול ‪v‬‬
‫‪ w‬נקבל את ‪ ,w → x → v‬כך‬ ‫‪ u‬את ‪ ,u → x → w‬ועבור ‪v‬‬ ‫לכל אחד מהם את המסלול הפשוט הארוך ביותר‪ ,‬נקבל עבור ‪w‬‬
‫שאיחוד המסלולים נותן מסלול שאינו פשוט‪ u → x → w → x → v :‬ולכן לא פותר את הבעיה‪.‬‬

‫‪30‬‬
‫‪:Dynamic‬‬ ‫קריטריונים ל־‪Programming‬‬
‫‪ .1‬תת־מבנה של אופטימיליות ־ כל בעיה ניתן לחלק לתתי־בעיות קטנות יותר‪ ,‬כך שהפתרון האופטימלי לבעיה הגדולה מורכב‬
‫מפתרונות אופטימליים לתתי־הבעיות הקטנות‪ .‬כמו כן‪ ,‬בניגוד לאלגוריתמים חמדניים בהם אנחנו עובדים ‪ Top-Down‬ובכל‬
‫פעם מצמצמים את גודל הבעיה שאנחנו עובדים איתה‪ ,‬כאן אנחנו עובדים ‪ ,Buttom-Up‬ובכל שלב מחלקים את הבעיה לבעיות‬
‫קטנות‪ ,‬ופותרים קודם אותן‪.‬‬
‫החלק העיקרי והמורכב ביותר בפתרון בעיות מסוג זה הוא זיהוי תתי־הבעיות‪ ,‬ופונקציית המטרה‪ .‬לאחר בניית פונקציית‬
‫המטרה קל יחסית לבנות את פונקציית האופטימיזציה באופן רקורסיבי‪ ,‬ולגזור את סדר הפעולות שייתן מימוש יעיל‪.‬‬
‫‪ .2‬תתי־בעיות חופפות ‪ /‬חוזרות ־ נרצה להיות מסוגלים להשתמש שוב ושוב באותן תתי־הבעיות‪ ,‬על מנת שאלגוריתם ששומר את‬
‫פתרונות תתי־הבעיות יהיה יעיל‪.‬‬
‫‪ .3‬שחזור פתרון אופטימלי ־ בנוסף למציאת הערך המינימלי עצמו‪ ,‬נרצה לשמור אינפורמציה נוספת שמאפשרת לנו לשחזר את‬
‫הפתרון שנותן את אותו ערך מינימלי‪ ,‬ולכן הוא אופטימלי )למשל בבעיית פס הייצור שמרנו מצביע למכונה הקודמת שאפשר‬
‫לנו לשחזר את המסלול שנתן עלות מינימלית‪ ,‬בבעיית העימוד שמרנו מצביע לזוג ‪ i.j‬הקודם שאפשר לנו לשחזר את העימוד‬
‫שנתן קנס מינימלי‪ ,‬וכו'(‪.‬‬

‫ממואיזציה‬
‫שיטה שמאפשרת לעבוד ‪ Top-Down‬ולהשיג יעילות של אלגוריתמי ‪ Buttom-Up‬ע”י כך שבפעם הראשונה שנתקל בתת־בעיה כלשהי‬
‫נחשב את הפתרון שלה‪ ,‬ולאחר מכן נשמור אותו לשימוש חוזר בעתיד‪ .‬באופן זה‪ ,‬בכל פעם שנתקל בתת־בעיה שכבר נתקלנו בה‬
‫בעבר )ועל כן חישבנו את פתרונה(‪ ,‬במקום לחשב את הפתרון מחדש‪ ,‬נשתמש בפתרון השמור‪.‬‬

‫הערה ‪ 7.9‬אז מתי עדיף לעבוד ‪ Buttom-Up‬ומתי עדיף לעבוד ‪ Top-Down‬עם ממואיזציה?‬

‫• חסרון לממואיזציה הוא הצורך לשמור את הפתרון של תתי־הבעיות‪ ,‬דבר שיכול להיות בעייתי במקרה שבו יש מס' גדול של‬
‫תתי־בעיות )וכפי שראינו‪ ,‬לעיתים במבנה של ‪ Buttom-Up‬ניתן להמנע משמירת כל תתי־הפתרונות(‪.‬‬
‫• יתרון לממואיזציה הוא שבמקרים מסוימים יש תתי־בעיות שלא נצטרך לפתור כלל על מנת לפתור את הבעיה הגדולה‪ ,‬ובאמצעות‬
‫ממואיזציה נוכל לחסוך את חישוב הפתרונות לתתי־בעיות אלו‪.‬‬

‫כלומר‪ ,‬אם נצטרך בכל מקרה לחשב את כל הפתרונות של תתי־הבעיות )כמו באלגוריתמים שראינו כאן(‪ ,‬נעדיף פתרונות‬
‫‪ ,Buttom-Up‬ואילו אם ניתן לפתור את הבעיה ללא חישוב כל הפתרונות‪ ,‬ונוכל לשמור )מבחינת המקום הדרוש( את תתי־‬
‫הבעיות הנחוצות לפתרון‪ ,‬נעדיף לעבוד ‪ Top-Down‬עם ממואיזציה‪.‬‬

‫‪31‬‬
‫‪ (Single-Source‬־ פרק ‪24‬‬ ‫)‪Shortest Paths‬‬ ‫‪ 8‬מסלולים קצרים ביותר ממקור יחיד‬
‫בספר‬
‫הקדמה‬ ‫‪8.1‬‬
‫הגדרה ‪ 8.1‬נגדיר את )‪ δ(u, v‬להיות המשקל המינימלי של מסלול ‪ p‬מ־‪ u‬ל־‪ ,v‬באופן הבא‪:‬‬

‫‪p‬‬
‫(‬
‫‪min{w(p) : u‬‬ ‫‪v} if there is a path f rom u to v‬‬
‫= )‪δ(u, v‬‬
‫∞‬ ‫‪otherwise‬‬

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

‫למה ‪ 8.2‬תת מסלול של מסלול קצר ביותר הוא בעצמו קצר ביותר‪.‬‬

‫הוכחה‪ :‬יהי ‪ p‬מסלול קצר ביותר ויהי ‪ psub‬תת־מסלול שלו‪ .‬בדומה למה שראינו בשיעור הקודם על תת־מבנה של אופטימליות‪ ,‬נניח‬
‫בשלילה שקיים תת־מסלול קצר יותר‪ ,‬נסמנו ‪ ,p0sub‬אזי ניתן להחליף במסלול המקורי ‪ p‬את תת־המסלול ‪ psub‬הנתון בתת־המסלול‬
‫הקצר יותר ‪ p0sub‬שקיים מההנחה‪ .‬אם כן‪ ,‬הרי שקיבלנו מסלול ‪ p0‬קצר יותר מ־‪ ,p‬בסתירה לכך שהמסלול המקורי ‪ p‬קצר ביותר‪.‬‬

‫טענה ‪ 8.3‬בלי הגבלת הכלליות‪ ,‬אם ‪ p‬מסלול קצר ביותר אז אין בו מעגלים‪.‬‬
‫הוכחה‪ :‬נניח בשלילה שקיים > ‪ p =< v0 , ..., w, ..., w, ..., vn‬מסלול קצר ביותר מ־ ‪ v0‬ל־ ‪ .vn‬ונסמן > ‪ c =< w, ..., w‬תת־המסלול‬
‫של ‪ p‬שהוא מעגל‪ .‬נחלק למקרים‪:‬‬
‫• אם ‪ ,w(c) < 0‬אז נוכל לבנות מסלול שחוזר על המעגל ‪ c‬כל מספר של פעמים‪ ,‬כך שתמיד אורך המסלול מתקצר‪ .‬לכן אין‬
‫מסלול קצר ביותר )תמיד יהיה מסלול קצר יותר‪ ,‬ונוכל לבנות אותו ע”י הוספת עוד חזרה על המעגל(‪ ,‬ובפרט ‪ p‬אינו מסלול‬
‫קצר ביותר‪.‬‬
‫• אם ‪ ,w(c) > 0‬אז נוכל למחוק את המעגל מהמסלול ‪) p‬כלומר להשאיר רק את ‪ w‬פעם אחת‪(p0 =< v0 , ..., w, ..., vn > :‬‬
‫ובכך לקצר את המסלול‪ .‬לכן בפרט ‪ p‬אינו מסלול קצר ביותר‪.‬‬
‫• אם ‪ ,w(c) = 0‬אז המסלול עם המעגל והמסלול ללא המעגל שניהם מסלולים קצרים ביותר‪ ,‬ומכאן שניתן לבחור תמיד במסלול‬
‫ללא המעגל )לכן הטענה אומרת בלי הגבלת הכלליות(‪.‬‬

‫טענה ‪ 8.4‬בלי הגבלת הכלליות‪ ,‬מק”ב מכיל לכל היותר ‪ |V | − 1‬קשתות )| ‪ |V‬צמתים(‪.‬‬

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

‫‪32‬‬
‫הגדרה ‪ 8.5‬באופן דומה להגדרה מאלגוריתם ה־‪ ,BFS‬נגדיר ) ‪ Gπ = (Vπ , Eπ‬באופן הבא‪:‬‬
‫}‪Vπ = {v ∈ V |π(v) 6= N IL} ∪ {s‬‬

‫}}‪Eπ = {(π(v), v)|v ∈ Vπ \{s‬‬

‫ל־ ‪ Gπ‬נקרא תת־גרף הקודמים‪.‬‬

‫הגדרה ‪ 8.6‬עץ מסלולים קצרים ביותר בעל שורש ‪ s ∈ V‬הוא תת גרף ) ‪ ,V 0 ⊆ V, E 0 ⊆ E ,G0 = (V 0 , E 0‬כך ש‪:‬‬
‫‪ V 0 .1‬מכיל את כל הצמתים ‪ v ∈ V‬כך שיש מסלול קצר ביותר מ־‪ s‬ל־‪.v‬‬

‫‪ G0 .2‬עץ עם שורש ‪.s‬‬


‫‪ .3‬לכל ‪ ,v ∈ V 0‬המסלול היחיד בין ‪ s‬ל־‪ v‬הוא מסלול קצר ביותר בין ‪ s‬ל־‪ v‬ב־‪.G‬‬

‫הערה ‪ 8.7‬כפי שניתן לראות בדוגמה הנ”ל‪ ,‬עץ מק”בים אינו בהכרח יחיד )הקשתות המודגשות באיור )‪ (b‬ובאיור )‪ (c‬מהוות שני עצי‬
‫מק”בים שונים לאותו גרף‪ ,‬שבאיור )‪.((a‬‬

‫טכניקת ההקלה )‪(Relaxation‬‬ ‫‪8.2‬‬


‫שני האלגוריתמים העיקריים שנלמד בפרק זה‪ Dijkstra ,‬ו־‪ ,Bellman-Ford‬משתמשים בטכניקת ההקלה )‪ .(relaxation‬בשיטה זו‪,‬‬
‫עבור כל צומת ‪ v‬נשמור שדה שמהווה חסם עליון על משקלו של מק”ב מ־‪ s‬אל ‪ .v‬לשדה זה נקרא אומדן של מסלול קצר ביותר‬
‫)‪ .(Shortest path estimate‬אומדני המק”בים‪ ,‬וכן הקודמים של צמתי הגרף יאותחלו באופן הבא‪:‬‬

‫כך שבאתחול נקבל לכל צומת שאינו ‪ s‬כי )‪.v.d = ∞ ≥ δ(s, v‬‬
‫לאחר מכן בתהליך ההקלה של קשת )‪ ,(u, v‬אם אפשר לשפר את המק”ב שמצאנו עד כה‪ ,‬מעדכנים את שדה הקודם ואת האומדן‬
‫באופן הבא‪:‬‬

‫בדוגמה הבאה ניתן לראות‪:‬‬


‫‪ .1‬באיור )‪ (a‬תהליך ההקלה על קשת )‪ (u, v‬מקטין את האומדן של מק”ב של ‪) v‬מסומן כערך בתוך הצומת(‪ ,‬וקובע אומדן חדש‬
‫לפי האומדן של ‪ u‬ומשקל הקשת ביניהם‪.‬‬

‫‪33‬‬
‫‪ .2‬באיור )‪ (b‬תהליך ההקלה אינו משפיע‪ ,‬שכן האומדן של ‪ v‬קטן יותר מזה שניתן יהיה לקבל ממסלול שעובר ב־)‪.(u, v‬‬

‫טענות עזר‬ ‫‪8.3‬‬


‫לכל אלגוריתם שבנוי מ־‪ ,Initalize-Single-Source‬ואחריו סדרה של פעולות ‪ ,Relax‬מתקיימות הטענות הבאות‪:‬‬

‫למה ‪) 8.8‬אי שיוויון המשולש( לכל ‪ (u, v) ∈ E‬מתקיים כי )‪) .δ(s, v) ≤ δ(s, u) + w(u, v‬ההוכחה טריוויאלית‪ ,‬רק דורשת חלוקה‬
‫למקרים השונים(‪.‬‬

‫למה ‪) 8.9‬תכונת חסם עליון(‬


‫‪ .1‬תמיד מתקיים )‪ v.d ≥ δ(s, v‬לכל ‪.v ∈ V‬‬
‫‪ .2‬אם )‪ v.d = δ(s, v‬בנקודת זמן מסוימת‪ ,‬אזי בהמשך ‪ v.d‬לא ישתנה‪.‬‬
‫הוכחה‪:‬‬
‫‪ .1‬באינדוקציה על מספר פעולות ה־‪:relax‬‬
‫תחילה נוכיח שתמיד )‪ v.d ≥ δ(s, v‬לכל ‪:v ∈ V‬‬
‫מהאתחול נקבל כי )‪.v.d ≥ δ(s, v‬‬ ‫בסיס‪:‬‬
‫נניח שהטענה נכונה עבור מספר פעולות ה־‪ relax‬עד הפעולה )‪ ,relax(u, v, w‬ונוכיח כי היא נכונה אחריה‪.‬‬ ‫צעד‪:‬‬
‫מההנחה‪ ,‬לפני פעולת ההקלה )‪ relax(u, v, w‬מתקיים )‪ v.d ≥ δ(s, v‬וגם )‪ .u.d ≥ δ(s, u‬נחלק למקרים‪:‬‬
‫־ אם )‪ ,v.d ≤ u.d + w(u, v‬אז ‪ v.d‬לא משתנה‪ ,‬ולכן הטענה נשארת נכונה‪.‬‬
‫־ אחרת‪ ,‬אם )‪ ,v.d > u.d + w(u, v‬נקבל‪:‬‬

‫)‪v.d = u.d + w(u, v) ≥ δ(s, u) + w(u, v‬‬ ‫≥‬ ‫)‪δ(s, v‬‬


‫}‪|{z‬‬ ‫}‪|{z‬‬
‫‪i.h‬‬ ‫‪4 inequality‬‬

‫וזה מש”ל‪.‬‬
‫‪ .2‬נשים לב שפעולת ה־‪ relax‬רק מקטינה את ‪ .v.d‬כעת לפי ‪ .v.d ≥ δ(s, v) ,1‬לכן לא ייתכן כי )‪ ,v.d < δ(s, v‬ומכאן שמרגע‬
‫שנקבל כי )‪ ,v.d = δ(s, v‬כיוון שכאמור פעולת ה־‪ relax‬רק מקטינה את ‪ ,v.d‬נקבל כי הערך של ‪ v.d‬לא יכול להשתנות עוד‪.‬‬

‫מסקנה ‪) 8.10‬תכונת ‪ (No-path‬אם אין מסלול מ־‪ s‬ל־‪ v‬אזי תמיד ∞ = ‪.v.d‬‬
‫הוכחה‪ :‬לפי ‪ .v.d ≥ δ(s, v) ,1‬כמו כן‪ ,‬אם אין מסלול מ־‪ s‬ל־‪ v‬מתקיים ∞ = )‪ ,δ(s, v‬לכן סך הכל ∞ = )‪ v.d ≥ δ(s, v‬ומכאן‬
‫ש־∞ = ‪.v.d‬‬

‫‪ s‬מסלול קצר ביותר‪ .‬אם מתקיים כי )‪ u.d = δ(s, u‬בזמן כלשהו לפני שבוצע ‪ relax‬על‬ ‫למה ‪) 8.11‬תכונת התכנסות( נניח ‪u → v‬‬
‫הקשת )‪ ,(u, v‬אזי )‪ v.d = δ(s, v‬בכל זמן לאחר ה־‪ relax‬לקשת )‪.(u, v‬‬
‫הוכחה‪ :‬מההנחה‪ ,‬כאשר עושים ‪ relax‬לקשת )‪ (u, v‬מתקיים כבר כי )‪ .u.d = δ(s, u‬כמו כן‪ ,‬נשים לב ש־)‪δ(s, u) + w(u, v) = δ(s, v‬‬
‫‪ s‬גם קצר ביותר‪ .‬כעת‪ ,‬אם בביצוע ה־‪ relax‬מתקיים כי‬ ‫‪ s‬מסלול קצר ביותר‪ ,‬ולכן תת־המסלול ‪u‬‬ ‫כיוון ש־‪u → v‬‬
‫)‪ ,v.d > u.d + w(u, v‬אז משנים את ‪ ,v.d‬וכיוון ש־)‪ ,u.d + w(u, v) = δ(s, u) + w(u, v) = δ(s, v‬לאחר ה־‪ relax‬נקבל‬
‫)‪ .v.d = δ(s, v‬כמובן שאם לא משנים את ‪ v.d‬סימן שכבר התקיים כי )‪ ,v.d = δ(s, v‬ואז זה נשאר נכון‪.‬‬

‫‪34‬‬
‫למה ‪) 8.12‬תכונת הקלת מסלולים( נניח > ‪ p =< v0 , ..., vn‬מסלול קצר ביותר מ־ ‪ s = v0‬ל־ ‪ .vn‬אם בסדרת פעולות ה־‪ relax‬יש‬
‫תת־סדרה של פעולות ‪ relax‬בסדר‪ ,relax(v0 , v1 , w), relax(v1 , v2 , w), ..., relax(vn−1 , vn , w) :‬אזי ) ‪.vn .d = δ(s, vn‬‬
‫הוכחה‪ :‬נובע מהלמה הקודמת של תכונת ההתכנסות )כל פעם מקבלים עבור הקשת ) ‪ (vi−1 , vi‬שלפני ה־‪,vi−1 .d = δ(s, vi−1 ) relax‬‬
‫ולכן כשעושים את ה־‪ relax‬על ) ‪ (vi−1 , vi‬מקבלים שמעכשיו גם ) ‪ vi .d = δ(s, vi‬וכו'(‪.‬‬

‫אלגוריתם ‪Bellman-Ford‬‬ ‫‪8.4‬‬


‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪8.4.1‬‬
‫אלגוריתם ‪ Bellman-Ford‬למציאת מסלולים קצרים ביותר ממקור יחיד פותר את המקרה הכללי של הבעיה‪ ,‬בו יש אפשרות שמשקל‬
‫קשת הוא שלילי‪ .‬אם קיים מעגל בעל משקל שלילי שניתן להגיע אליו מהמקור‪ ,‬האלגוריתם מחזיר שאין פתרון‪ ,‬ואילו אם אין מעגל‬
‫כנ”ל‪ ,‬האלגוריתם מחזיר את המסלולים הקצרים ביותר ואת המשקלים שלהם‪.‬‬
‫הרעיון באלגוריתם ‪ Bellman-Ford‬הוא יחסית נאיבי ונובע מתכונת הקלת המסלולים יחד עם ההבנה כי במסלול קצר ביותר יש‬
‫לכל היותר ‪ |V | − 1‬קשתות‪ .‬הוא עובר ‪ |V | − 1‬פעמים על כל הקשתות בגרף ומבצע ‪ .relax‬באופן זה הוא מבטיח שתווצר תת־סדרה‬
‫של פעולות ‪ relax‬על הקשתות שבמסלול הקצר ביותר )כיוון שתהיה כל תת־סדרה של לכל היותר ‪ |V | − 1‬קשתות ־ למשל אם בגרף‬
‫בעל ‪ 4‬צמתים יש את הקשתות ‪ 5,4,3,2,1‬אז לאחר שנבצע שלושה מעברים על כל הקשתות כך ־ ‪ 5,4,3,2,1,5,4,3,2,1,5,4,3,2,1‬נוכל למצוא‬
‫בסדרה זו כל תת־סדרה באורך ‪ 3‬או פחות של קשתות מהגרף‪ ,‬מודגשת לדוגמה הסדרה ‪ .(4,1,3‬נשים לב שסדר המעבר הפנימי בתוך‬
‫חזרה כלשהי מבין ‪ |V | − 1‬החזרות על הקשתות אינו חשוב‪.‬‬

‫האלגוריתם‬ ‫‪8.4.2‬‬

‫הערה ‪ 8.13‬שורה ‪ 6‬למעשה בודקת האם פעולת ‪ relax‬נוספת תקטין את הערך של ‪ .v.d‬נשים לב שאילו אין מעגלים שליליים בגרף‪,‬‬
‫לאחר ‪ |V | − 1‬סבבים של פעולות ‪ relax‬על כל הקשתות כל המשקלים חייבים להיות מינימליים‪ .‬לכן‪ ,‬אם ניתן לבצע ‪ relax‬שיקטין‬
‫את ‪ ,v.d‬אזי המשמעות היא שלא התכנסנו עדיין למשקלים קטנים ביותר‪ ,‬ומכאן שיש מעגל שלילי בגרף‪.‬‬

‫דוגמת הרצה‬ ‫‪8.4.3‬‬

‫‪35‬‬
‫ניתוח סיבוכיות‬ ‫‪8.4.4‬‬
‫הלולאה הראשונה )שורות ‪4‬־‪ (2‬נעשית ב־)|‪ ,O(|V | × |E‬ואחריה הלולאה השניה )שורות ‪7‬־‪ (5‬נעשית ב־)|‪ .O(|E‬לכן סך הכל‬
‫הסיבוכיות היא )|‪.O(|V | × |E‬‬

‫הוכחת נכונות‬ ‫‪8.4.5‬‬


‫למה ‪ 8.14‬יהי )‪ G = (V, E‬גרף מכוון‪ ,‬ממושקל‪ ,w : E → R ,‬ונניח שאין מעגלים שליליים שנגישים מ־‪ .s‬אז אחרי ‪|V | − 1‬‬
‫האיטרציות של לולאת ה־‪ for‬בשורות ‪4‬־‪ 2‬באלגוריתם ‪ ,Bellman-Ford‬נקבל כי )‪ v.d = δ(s, v‬לכל צומת ‪ v‬בגרף‪.‬‬
‫הוכחה‪ :‬עבור צומת ‪ v‬שאינו נגיש מ־‪ s‬מתקיים ∞‪ ,δ(s, v) = v.d = +‬לפי למת ה־‪ ,No-Path‬כדרוש‪.‬‬
‫עבור צומת ‪ v‬שנגיש מ־‪ ,s‬יהי > ‪ ,p =< v0 , v1 , ..., vk‬כך ש־‪ ,v0 = s‬ו־‪ ,vk = v‬מסלול קצר ביותר מ־‪ s‬ל־‪ .v‬כיוון ש־‪ p‬מק”ב‪,‬‬
‫ניתן להניח בה”כ כי אין מעגל ב־‪ ,p‬כלומר הוא מסלול פשוט‪ ,‬ואורכו לכל היותר ‪) |V | − 1‬כלומר ‪ .(k ≤ |V | − 1‬כל איטרציה של‬
‫הלולאה משורות ‪4‬־‪ 2‬עוברת על כל הקשתות בגרף‪ ,‬ובפרט האיטרציה ה־‪ i‬עוברת גם על הקשת ) ‪ .(vi−1 , vi‬מתכונת הקלת המסלולים‬
‫נובע אם כן כי לאחר ‪ |V | − 1‬האיטרציות יתקבל כי )‪.v.d = vk .d = δ(s, vk ) = δ(s, v‬‬

‫משפט ‪) 8.15‬נכונות אלגוריתם ‪(Bellman-Ford‬‬


‫נריץ ‪ BF‬על גרף )‪ ,G = (V, E‬מכוון וממושקל )‪ (w : E → R‬מצומת מקור ‪.s‬‬
‫אם ב־‪ G‬אין מעגלים שליליים שנגישים מ־‪ s‬אז האלגוריתם מחזיר ‪ ,True‬וגם )‪ v.d = δ(s, v‬לכל צומת ‪ v‬בגרף‪ ,‬ו־ ‪ Gπ‬גרף‬
‫מסלולים קצרים ביותר‪.‬‬
‫אם יש מעגל שלילי שנגיש מ־‪ s‬אזי ‪ BF‬מחזיר ‪.False‬‬
‫הוכחה‪ :‬נניח שב־‪ G‬אין מעגלים שליליים שנגישים מ־‪ .s‬לפי הלמה הקודמת‪ ,‬לאחר לולאת ה־‪ for‬משורות ‪4‬־‪ 2‬מתקיים‪:‬‬

‫}‪= δ(s, v) ≤ δ(s, u) + w(u, v) |{z‬‬


‫}‪v.d |{z‬‬ ‫)‪= u.d + w(u, v‬‬
‫}‪|{z‬‬
‫‪lemma‬‬ ‫‪4ineq‬‬ ‫‪lemma‬‬

‫לכן התנאי בשורה ‪ 6‬לעולם לא יתקיים‪ ,‬ו־‪ BF‬יחזיר ‪ ,True‬כדרוש‪.‬‬


‫כעת‪ ,‬נניח שב־‪ G‬יש מעגל שלילי שנגיש מ־‪ ,s‬נסמנו > ‪ c =< v0 , v1 , ..., vk‬כך ש־ ‪.vk = v0‬‬
‫‪k‬‬
‫‪ .‬נניח בשלילה ש־‪ BF‬מחזיר ‪ .True‬אם כן‪ ,‬הרי שלכל ‪ (u, v) ∈ E‬מתקיים‬
‫‪P‬‬
‫‪ c‬מעגל שלילי‪ ,‬לכן ‪w(vi−1 , vi ) < 0‬‬
‫‪i=1‬‬
‫)‪ .v.d ≤ u.d + w(u, v‬בפרט‪ vi .d ≤ vi−1 .d + (vi−1 , vi ) ,‬לכל ‪ .1 ≤ i ≤ k‬מכאן שמתקיים כי‪:‬‬
‫‪k‬‬
‫‪X‬‬ ‫‪X‬‬‫‪k‬‬ ‫‪k‬‬
‫‪X‬‬
‫)∗(‬ ‫≤ ‪vi .d‬‬ ‫‪vi−1 .d+‬‬ ‫) ‪w(vi−1 , vi‬‬
‫‪i=1‬‬ ‫‪i=1‬‬ ‫‪i=1‬‬

‫‪k‬‬
‫‪P‬‬
‫נשים לב ש־‪vi .d = v1 .d + v2 .d + ... + vk−1 .d + vk .d‬‬
‫‪i=1‬‬
‫‪k‬‬
‫‪P‬‬
‫וכן ש־‪vi−1 .d = v0 .d + v1 .d + v2 .d + ... + vk−1 .d‬‬
‫‪i=1‬‬
‫‪k‬‬
‫‪P‬‬ ‫‪k‬‬
‫‪P‬‬
‫‪ .‬נוכל לבטל את הביטויים הללו בשני האגפים באי‬ ‫= ‪vi .d‬‬ ‫כעת‪ ,‬מכך ש־ ‪ ,v0 = vk‬הרי שלמעשה מתקיים כי ‪vi−1 .d‬‬
‫‪i=1‬‬ ‫‪i=1‬‬
‫‪k‬‬
‫‪ ,‬בסתירה לכך שהמעגל ‪ c‬שלילי‪ .‬לכן הנחת השלילה שגויה‪ ,‬ו־‪ BF‬מחזיר‬
‫‪P‬‬
‫השיוויון המסומן ב־)∗(‪ ,‬ונקבל כי ‪w(vi−1 , vi ) ≥ 0‬‬
‫‪i=1‬‬
‫‪.False‬‬

‫מק”בים ממקור יחיד בגרף מכוון חסר מעגלים )‪(DAG‬‬ ‫‪8.5‬‬


‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪8.5.1‬‬
‫עבור גרף חסר מעגלים‪ ,‬נוכל למצוא גרף מסלולים קצרים ביותר בסיבוכיות של )|‪ O(|V | + |E‬באופן הבא ־ תחילה נמיין טופולוגית‬
‫את צמתי הגרף‪ .‬כעת‪ ,‬במקום לעבור ‪ |V | − 1‬פעמים על כל קשתות הגרף כפי שעשינו באלגוריתם ‪ ,BF‬נוכל לבצע את פעולות ה־‪relax‬‬
‫לפי סדר המיון הטופולוגי‪ .‬לכל צומת במיון הטופולוגי נבצע ‪ relax‬לכל הקשתות היוצאות ממנה‪ ,‬ובכך מובטח לנו שכל ‪ relax‬יתבצע‬
‫רק לאחר שבוצע ‪ relax‬על הקשת הקודמת במסלול )כי כל מסלול בגרף עובר בצמתי הגרף לפי סדר המיון הטופולוגי‪ ,‬משמאל לימין‬
‫כפי שנראה בדוגמה למטה(‪ .‬נשים לב שבדרך זו‪ ,‬כיוון שאנחנו עוברים פעם אחת על כל צומת בגרף‪ ,‬ולכל צומת מבצעים ‪ relax‬על‬
‫כל קשת יוצאת בדיוק פעם אחת‪ ,‬אנחנו מבצעים רק מעבר אחד על כל הקשתות‪ ,‬כך שהסיבוכיות היא לינארית‪.‬‬

‫‪36‬‬
‫האלגוריתם‬ ‫‪8.5.2‬‬

‫דוגמת הרצה‬ ‫‪8.5.3‬‬

‫הערה ‪ 8.16‬שימוש מעניין באלגוריתם הוא למציאת מסלולים קריטיים בניתוח ‪ PERT) PERT charts‬זה ראשי תיבות ל־‪program‬‬
‫‪ .(evaluation and review technique‬בגרף כזה קשתות מייצגות עבודות שיש להשלים‪ ,‬והמשקלות את הזמן הדרוש ע”מ להשלימן‪.‬‬
‫אם קשת )‪ (u, v‬נכנסת לצומת ‪ v‬וקשת )‪ (v, x‬יוצאת מ־‪ ,v‬אזי חייבים לבצע את עבודה )‪ (u, v‬לפני שניתן להתחיל את עבודה‬
‫)‪ .(v, x‬מסלול קריטי הוא המסלול הארוך ביותר של קשתות בגרף‪ ,‬ונותן חסם תחתון למשך הזמן שבו ניתן להשלים את כל העבודות‬
‫בפרוייקט‪.‬‬
‫• דרך אחת למצוא את המסלול הקריטי היא ע”י שלילת המשקלים )כפל המשקל במינוס ‪ (1‬ושימוש באלגוריתם ‪Dag-Shortest-‬‬
‫‪.Paths‬‬
‫• דרך שניה היא לבצע מספר שינויים באלגוריתם ‪ Dag-Shortest-Paths‬לפני הרצתו‪ :‬מחליפים את ∞ ב־∞‪ −‬בשורה ‪ 2‬של‬
‫אלגוריתם האתחול‪ ,‬ואת > ב־< באלגוריתם ה־‪.relax‬‬
‫מציאת המסלול הקריטי חשובה כיוון שהיא מוצאת לאילו עבודות בפרוייקט יש ”מקום תמרון” בזמני הביצוע‪ ,‬בעוד שבעבודות אשר‬
‫מהוות חלק מהמסלול הקריטי‪ ,‬עמידה בזמנים היא הכרחית‪.‬‬

‫)דייקסטרה(‬ ‫אלגוריתם ‪Dijkstra‬‬ ‫‪8.6‬‬


‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪8.6.1‬‬
‫אלגוריתם דייקסטרה מהווה מעין שילוב של אלגוריתם ‪ BF‬והאלגוריתם של ‪ .Prim‬האלגוריתם משתמש בתור עדיפויות של צמתים‬
‫עם ערכי ‪ d‬כמפתחות )בדומה לאלגוריתם של ‪ .(Prim‬חשוב לשים לב שהאלגוריתם עובד רק עבור גרפים בעלי קשתות ממשקלים‬
‫אי־שליליים‪.‬‬

‫‪37‬‬
‫האלגוריתם‬ ‫‪8.6.2‬‬

‫דוגמת הרצה‬ ‫‪8.6.3‬‬

‫ניתוח סיבוכיות‬ ‫‪8.6.4‬‬


‫אופן המימוש של תור העדיפויות בא לידי ביטוי בניתוח הסיבוכיות של האלגוריתם של דייקסטרה‪ .‬נשים לב שבמהלך האלגוריתם‬
‫מתבצעות פעולות ‪) extract-min‬שורה ‪ ,(4‬וכן מתבצעות פעולות ‪ decrease-key‬כחלק מפעולת ה־‪) relax‬שורה ‪ .(8‬כידוע‪ ,‬בערימת‬
‫פיבונאצ'י הסיבוכיות של פעולת ‪ extract-min‬על ערימה בגודל | ‪ |V‬תהיה ))| ‪ ,O(log(|V‬וכן הסיבוכיות ה־‪ amortized‬של פעולת‬
‫‪ decrease-key‬תהיה )‪.O(1‬‬
‫בניית תור העדיפויות תקח זמן לינארי‪ .‬כמו כן‪ ,‬אנחנו מבצעים | ‪ |V‬פעולות ‪ extract-min‬ולכל היותר |‪ |E‬פעולות ‪decrease-key‬‬
‫)שכן אנו עוברים על כל צומת פעם אחת‪ ,‬ולכל צומת אנחנו מבצעים ‪ relax‬אחד על כל קשת יוצאת(‪ .‬מכאן שבמימוש של ערימת‬
‫פיבונאצ'י הסיבוכיות שתתקבל היא )|‪.O(|V |log(|V |) + |E‬‬
‫לשם השוואה‪ ,‬בערימה בינארית פעולת ‪ decrease-key‬לוקחת ))| ‪ ,O(log(|V‬כך שהיינו מקבלים סיבוכיות של‬
‫))| ‪ O(|V |log(|V |) + |E|log(|V‬עבור מימוש זה של התור‪.‬‬

‫טענה ‪ 8.17‬עבור כל ‪ v ∈ S‬מתקיים כי )‪.v.d = δ(s, v‬‬


‫הוכחה‪ :‬באינדוקציה על |‪:|S‬‬
‫‪ ,|S| = 0‬נכון באופן ריק‪.‬‬ ‫בסיס‪:‬‬
‫לפי הלמה של תכונת חסם־עליון‪ ,‬מספיק להראות ש־)‪ v.d = δ(s, v‬כש־‪ v‬נוסף ל־‪) S‬שורה ‪ .(6‬נניח בשלילה שהטענה‬ ‫צעד‪:‬‬
‫לא נכונה‪ .‬יהי ‪ u ∈ V‬הצומת הראשון שנוסף ל־‪ S‬עבורו )‪) u.d 6= δ(s, u‬בהכרח )‪.(u.d > δ(s, u‬‬
‫נשים לב כי ‪ ,u 6= s‬שכן אחרת‪ ,‬אם ‪ ,u = s‬אז כיוון ש־‪ ,s.d = 0‬ולא ייתכן ש־‪) δ(s, s) < 0‬כי אין קשתות שליליות‪,‬‬
‫ובפרט אין מעגלים שליליים( אזי בהכרח ‪ ,δ(s, s) = 0‬ומכאן ש־)‪.s.d = δ(s, s‬‬
‫לכן‪ ,‬כש־‪ u‬נוסף ל־‪ S ,S‬לא ריקה )היא מכילה לכל הפחות את ‪ .(s‬יהי ‪ p‬מסלול קצר ביותר מ־‪ s‬ל־‪ .u‬נסמן ב־‪ y‬את‬
‫‪ ,s‬כך‬ ‫‪x→y‬‬ ‫הצומת הראשון ב־‪ p‬שאינו ב־‪ ,S‬ונסמן ב־‪ x‬את הצומת שלפניו במסלול )כלומר ‪ p‬הוא המסלול ‪u‬‬
‫‪ s‬מורכב כולו מצמתים ב־‪ ,S‬וייתכן ‪ x = s‬ו‪/‬או ‪.(y = u‬‬ ‫שתת המסלול ‪x‬‬

‫‪38‬‬
‫‪ s‬הוא מק”ב )שכן הוא תת־מסלול של מק”ב(‪ .‬כמו כן‪ ,‬נשים לב ש־)‪) x.d = δ(s, x‬שכן ‪ u‬הצומת הראשון‬ ‫נבחין כי ‪x‬‬
‫עבורו זה לא מתקיים‪ ,‬והוספנו את ‪ x‬ל־‪ S‬לפני שהוספנו את ‪ .(u‬לכן‪ ,‬מתכונת ההתכנסות‪ ,‬אחרי שהוספנו את ‪ x‬ל־‪S‬‬
‫וביצענו )‪ ,relax(x, y, w‬התקיים )‪ .y.d = δ(s, y‬כעת אם ‪ u = y‬קיבלנו סתירה לכך ש־)‪ .u.d 6= δ(s, u‬נניח אם כן‬
‫ש־‪.u 6= y‬‬
‫מכך ש־‪ u‬נבחר ב־‪ extract-min‬לפני ‪ ,y‬הרי שהתקיים ‪ .u.d ≤ y.d‬בנוסף‪ ,‬מכך ש־‪ y‬צומת בדרך ל־‪ u‬במק”ב ‪,p‬‬
‫והמשקלים של הקשתות כולם אי־שליליים‪ ,‬הרי שמתקיים )‪ .δ(s, y) ≤ δ(s, u‬סך הכל קיבלנו כי‪:‬‬

‫)‪δ(s, y) = y.d ≥ u.d > δ(s, u) ≥ δ(s, y‬‬

‫כלומר קיבלנו כי )‪ ,δ(s, y) > δ(s, y‬וזו כמובן סתירה‪ .‬לכן הנחת השלילה שגויה‪ ,‬ומתקיים כי )‪ u.d = δ(s, u‬כש־‪ u‬נוסף‬
‫ל־‪ ,S‬כדרוש‪.‬‬

‫הערה ‪ 8.18‬איור להמחשת התמונה‪:‬‬

‫‪39‬‬
‫‪(Dierence Constraints and Shortest‬‬ ‫‪ 9‬אילוצי הפרשים ומסלולים קצרים ביותר‬
‫)‪ Paths‬־ המשך פרק ‪ 24‬בספר‬
‫הקדמה ־ תכנון לינארי )‪(Linear Programming‬‬ ‫‪9.1‬‬
‫במקרה הכללי של בעיית תכנון לינארי נתונים מטריצה ‪ A‬וקטור ‪ b‬באורך ‪ ,m‬ווקטור ‪ c‬באורך ‪ .n‬המטרה היא למצוא וקטור ‪x‬‬
‫‪m×n‬‬
‫‪n‬‬
‫‪P‬‬
‫מקבלת ערך מקסימלי‪ ,‬בהנתן ‪ m‬האילוצים הנתונים ע”י ‪ .Ax ≤ b‬כלומר‪ ,‬כל שורה‬ ‫באורך ‪ n‬שעבורו פונקציית המטרה ‪ci xi‬‬
‫‪i=1‬‬
‫במטריצה ‪ A‬יחד עם האיבר המתאים מ־‪ b‬מהווה אילוץ על הערכים האפשריים של ‪ .x‬למשל‪ ,‬עבור השורה ה־‪ k‬של מטריצה ‪ A‬צריך‬
‫‪m‬‬
‫‪P‬‬
‫‪.‬‬ ‫להתקיים ‪aki xi ≤ bi‬‬
‫‪i=1‬‬
‫במקרה שאנו נדון בו ערכה של פונקציית המטרה כלל לא חשוב‪ ,‬ונרצה רק למצוא פתרון אפשרי שמקיים את האילוצים‪.‬‬

‫מערכות של הפרשי אילוצים )‪(Systems of Dierence Consraints‬‬ ‫‪9.2‬‬


‫במערכת של הפרשי אילוצים כל שורה במטריצת התכנון הלינארי ‪ A‬מכילה ‪ 1‬אחד‪ ,‬ו־‪ −1‬אחד‪ ,‬וכל שאר התאים מכילים ‪ .0‬לכן‪,‬‬
‫האילוצים הנתונים ע”י ‪ Ax ≤ b‬הם מערכת של ‪ m‬אילוצי הפרשים ב־‪ n‬נעלמים‪ ,‬כאשר כל אילוץ הוא אי־שיוויון מהצורה ‪,xi −xj ≤ bk‬‬
‫עבור ‪.1 ≤ k ≤ m, 1 ≤ i, j ≤ n‬‬
‫למשל‪ ,‬ניתן לתרגם את הבעיה הבאה‪:‬‬

‫בתור האילוצים הבאים‪:‬‬

‫למה ‪ 9.1‬יהי > ‪ x =< x1 , x2 , ..., xn‬פתרון למערכת ‪ Ax ≤ b‬של אילוצי הפרשים‪ ,‬ויהי ‪ d‬קבוע כלשהו‪.‬‬
‫אזי > ‪ x + d =< x1 + d, ..., xn + d‬גם הוא פתרון ל־‪.Ax ≤ b‬‬

‫הוכחה‪ :‬לכל ‪ xi , xj‬מתקיים ‪ ,(xj + d) − (xi + d) = xj − xi‬לכן אם ‪ x‬מקיים את ‪ ,Ax ≤ b‬אז גם ‪ x + d‬מקיים זאת‪.‬‬

‫המתאים הוא גרף מכוון משוקלל‬ ‫גרף האילוצים )‪(Constraint Graph‬‬ ‫הגדרה ‪ 9.2‬בהנתן מערכת ‪ Ax ≤ b‬של אילוצי הפרשים‪,‬‬
‫)‪ ,G = (V, E‬שבו‪:‬‬

‫} ‪V = {v0 , v1 , ..., vn‬‬


‫}) ‪E = {(vi , vj ) : xj − xi ≤ bk is a constraint} ∪ {(v0 , v1 ), (v0 , v2 ), (v0 , v3 ), ..., (v0 , vn‬‬

‫הערה ‪ 9.3‬הצומת ‪ v0‬צורף לגרף כדי להבטיח שכל צומת אחר נגיש ממנו‪ .‬שאר הצמתים מייצגים נעלמים ‪ ,xi‬והקשתות מייצגות את‬
‫אילוצי ההפרשים‪ ,‬כך שאם ‪ xj − xi ≤ bk‬הוא אילוץ אז מתקיים ‪ .w(vi , vj ) = bk‬משקל הקשתות היוצאות מ־ ‪ v0‬הוא ‪.0‬‬

‫‪40‬‬
‫למשל‪ ,‬עבור המערכת מהדוגמה הנ”ל‪ ,‬גרף האילוצים יהיה‪:‬‬

‫משפט ‪ 9.4‬בהנתן מערכת אילוצי הפרשים ‪ ,Ax ≤ b‬יהי )‪ G = (V, E‬גרף האילוצים המתאים‪ .‬אם ‪ G‬אינו מכיל מעגל שלילי אז‪:‬‬
‫)) ‪x = (δ(v0 , v1 ), δ(v0 , v2 ), δ(v0 , v3 ), ..., δ(v0 , vn‬‬
‫הוא פתרון אפשרי של המערכת‪ .‬אם ‪ G‬מכיל מעגל שלילי‪ ,‬אזי לא קיים עבור המערכת פתרון המקיים את האילוצים‪.‬‬
‫הוכחה‪ :‬נניח שאין מעגלים שליליים שנגישים מ־ ‪) v0‬לכן‪ ,‬אין מעגלים שליליים כלל‪ ,‬כי כל צומת נגיש מ־ ‪ .(v0‬מאי־שיוויון המשולש‪,‬‬
‫מתקיים לכל ‪ i, j‬כי‪ ,δ(v0 , vj ) ≤ δ(v0 , vi ) + w(vi , vj ) :‬או באופן שקול‪.δ(v0 , vj ) − δ(v0 , vi ) ≤ w(vi , vj ) ,‬‬
‫לכן ) ‪ xi = δ(v0 , vi ), xj = δ(v0 , vj‬מקיימים את אילוץ ההפרשים ) ‪ xj − xi ≤ w(vi , vj‬המתאים לקשת‪.‬‬
‫} ‪| {z‬‬
‫‪bk‬‬
‫כעת‪ ,‬נניח שיש מעגל שלילי‪ ,‬שאינו כולל את ‪) v0‬אין קשתות שנכנסות ל־ ‪ ,v0‬כך שלא ייתכן שהוא חלק ממעגל(‪ .‬נניח בה”כ‬
‫שהמעגל הוא > ‪ ,c =< v1 , v2 , ..., vk‬כך ש־ ‪ .vk = v1‬המעגל ‪ c‬מתאים למערכת האילוצים הבאה‪:‬‬

‫נשים לב שאם נסכום את כל אי־השיוויונות‪ ,‬אי השיוויון חייב להשמר‪ ,‬וכיוון שמחסרים ומוסיפים כל ‪ xi‬פעם אחת )כולל את ‪,x1‬‬
‫‪k−1‬‬
‫‪P‬‬
‫≤ ‪.0‬‬ ‫כי הרי ‪ ,(xk = x1‬נקבל ‪ 0‬באגף שמאל‪ ,‬ואת משקל כל הקשתות של המעגל מצד ימין‪w(vi , vi+1 ) = w(c) :‬‬
‫‪i=1‬‬
‫כלומר‪ ,‬קיבלנו כי משקל המעגל הוא אי־שלילי‪ ,‬בסתירה להנחה שזה מעגל שלילי )כלומר מתקיים ‪.(w(c) < 0‬‬

‫פתרון מערכות של הפרשי אילוצים‬ ‫‪9.2.1‬‬


‫מהמשפט הנ”ל נובע כי ניתן לפתור מערכת של הפרשי אילוצים באמצעות אלגוריתם בלמן־פורד‪.‬‬
‫מערכת של ‪ m‬אילוצים ב־‪ n‬נעלמים תיוצג ע”י גרף של ‪ n + 1‬צמתים ו־‪ m + n‬קשתות‪ ,‬לכן סיבוכיות הפתרון בדרך זו תהיה‬
‫)‪.O((n + 1)(n + m)) = O(n2 + nm‬‬

‫־ פרק ‪ 25‬בספר‬ ‫מסלולים קצרים ביותר בין כל הזוגות )‪(All Pairs Shortest Paths‬‬ ‫‪10‬‬
‫הקדמה‬ ‫‪10.1‬‬
‫כמעט בכל האלגוריתמים בפרק זה הקלט הוא גרף )‪ G = (V, E‬ממושקל‪ ,‬המיוצג ע”י מטריצת שכנויות )ולא רשימת שכנויות(‪ ,‬כך ש‪:‬‬

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

‫‪41‬‬
‫טבלת הפלט של האלגוריתמים היא מטריצה ) ‪ D = (dij‬בגודל ‪ ,n × n‬כאשר התא ‪ dij‬מכיל את משקלו של‪Q‬המסלול הקל ביותר‬
‫שבה ‪πij = N IL‬‬ ‫מצומת ‪ i‬לצומת ‪ .j‬בסוף ריצת האלגוריתם יתקיים )‪ .dij = δ(i, j‬כמו כן‪ ,‬נחשב גם מטריצת קודמים ) ‪= (πij‬‬
‫אם ‪ i = j‬או אם לא קיים מסלול מ־‪ i‬ל־‪ .j‬אחרת‪ πij ,‬הוא הקודם של ‪ j‬על איזשהו מק”ב מ־‪.i‬‬

‫אם כל המשקלים חיוביים‪ ,‬ניתן להשתמש | ‪ |V‬פעמים באלגוריתם של דייקסטרה‪ .‬בכל פעם נקבל שורה מהמטריצות שאותן יש‬
‫להחזיר‪ ,‬ובסך הכל הסיבוכיות תהיה )|‪ .O(|V |(|V |log|V | + |E|)) = O(|V |2 log|V | + |V ||E‬לעומת זאת‪ ,‬אם יש משקלים שליליים‬
‫בגרף לא נוכל להשתמש בדייקסטרה‪ .‬נוכל להשתמש באלגוריתם בלמן־פורד )גם כן להריצו | ‪ |V‬פעמים‪ ,‬פעם אחת לכל שורה(‪ ,‬ונקבל‬
‫שהסיבוכיות הכוללת תהיה )|‪) O(|V |2 |E‬במקרה שהגרף צפוף זה ) ‪ .(O(n4‬בפרק זה נראה פתרונות יעילים יותר למקרה שבו יש‬
‫משקלים שליליים‪.‬‬

‫מסלולים קצרים ביותר וכפל מטריצות‬ ‫‪10.2‬‬


‫נציג פתרון באמצעות אלגוריתם תכנון דינאמי של בעיית המסלולים הקצרים ביותר בין כל הזוגות בגרף מכוון‪.‬‬
‫נגדיר‪:‬‬
‫(‬
‫)‪(0‬‬ ‫‪0 if i = j‬‬
‫= ‪lij‬‬
‫‪∞ if i 6= j‬‬

‫)‪(m‬‬
‫‪ lij‬להיות אורך המסלול הקצר ביותר בין ‪ i‬ל־‪ j‬שיש בו לכל היותר ‪ m‬קשתות )‪.(m ≥ 0‬‬ ‫באופן כללי‪ ,‬נגדיר את‬
‫באופן רקורסיבי נגדיר‪:‬‬

‫)‪(m‬‬ ‫)‪(m−1‬‬ ‫)‪(m−1‬‬


‫‪lij‬‬ ‫‪= min(lij‬‬ ‫‪, min {lik‬‬ ‫)} ‪+ wkj‬‬
‫‪1≤k≤n‬‬
‫)‪(m−1‬‬
‫‪= min {lik‬‬ ‫} ‪+ wkj‬‬
‫‪1≤k≤n‬‬

‫)‪(m−1‬‬
‫‪ lij‬הוא אורך המסלול המינימלי מ־‪ i‬ל־‪ j‬שעובר ב־‪ m − 1‬קשתות‬ ‫הערה ‪ 10.2‬בביטוי הרקורסיבי הנ”ל משתמעת החלוקה הבאה‪:‬‬
‫)‪(m−1‬‬
‫‪ min {lik‬הוא אורך המסלול המינימלי מ־‪ i‬ל־‪ j‬שעובר ב־‪ m‬קשתות )‪ m − 1‬קשתות לכל היותר עד ‪,k‬‬ ‫לכל היותר‪ ,‬ו־} ‪+ wkj‬‬
‫‪1≤k≤n‬‬
‫)‪(m−1‬‬
‫‪.lij‬‬ ‫ועוד הקשת מ־‪ k‬ל־‪ .(j‬נשים לב שהשיוויון האחרון נובע מכך שאנו כוללים את המקרה שבו ‪ ,k = j‬ואז מקבלים ‪+ wjj‬‬
‫}‪|{z‬‬
‫‪=0‬‬

‫הערה ‪ 10.3‬כיוון שמק”בים אינם מכילים מעגלים )ועל כן אורכם לכל היותר ‪ ,(n − 1‬מתקיים כי‪:‬‬
‫)‪(n−1‬‬ ‫)‪(n‬‬ ‫)‪(n+1‬‬ ‫)‪(n+2‬‬
‫‪δ(i, j) = lij‬‬ ‫‪= lij = lij‬‬ ‫‪= lij‬‬ ‫‪= ...‬‬
‫)‪(n−1‬‬
‫‪ lij‬לכל ‪.i, j‬‬ ‫לכן מספיק לנו לחשב את‬

‫האלגוריתם )וניתוח סיבוכיות(‬ ‫‪10.2.1‬‬


‫‪‬‬ ‫‪‬‬
‫)‪(m‬‬ ‫)‪(1‬‬
‫‪) L(m) = ‬כלומר )‪ L(m‬היא מטריצה‬ ‫‪lij‬‬ ‫‪ .(wij ) = lij‬נגדיר ‪‬‬ ‫נבחין כי מהאופן שבו הגדרנו את המטריצה ) ‪ (wij‬נובע כי‬

‫)‪Q(m‬‬ ‫)‪(m‬‬ ‫)‪(m‬‬ ‫)‪(m‬‬


‫שבמקום ה־‪ ij‬שלה נמצא הערך ‪ .(lij‬נרצה לחשב את ) ‪ L(m) = (lij‬עבור ‪ ,m = n − 1 = |V | − 1‬ואת ) ‪= (πij‬‬
‫)שמוגדרת באופן דומה למטריצה )‪.(L(m‬‬

‫תחילה נציג אלגוריתם ”טיפשי” שבהנתן מטריצות )‪ L(m−1‬ו־ ‪ W‬מחזיר את )‪ ,L(m‬ועובד בסיבוכיות ) ‪.O(n3‬‬

‫‪42‬‬
‫אם נשתמש בו )‪ O(n‬פעמים מ־‪ m = 2‬ועד ‪ m = n − 1‬באופן הבא‪:‬‬

‫זה יעשה בסיבוכיות של ) ‪ ,O(n4‬וזה לא יעיל )אפילו פחות מהפתרון עם אלגוריתם בלמן־פורד(‪.‬‬

‫הבחנה חשובה היא שבפתרון הנ”ל בכל שלב הארכנו את המסלול בקשת אחת‪ .‬באופן דומה לאלגוריתמים שראינו בקורסים‬
‫אחרים להעלאה יעילה של מספר בחזקה‪ ,‬ניתן במקום להאריך את המסלול בכל פעם בקשת אחת לכל היותר‪ ,‬להכפיל אותו‪ ,‬ובכך‬
‫לצמצם משמעותית את מספר הפעמים שאנחנו מבצעים את הפעולה היקרה )את ‪ .(Extend-Shortest-Paths‬אם במקום להריץ בכל‬
‫שלב את ‪ Extend-Shortest-Paths‬עם ‪ L‬ו־ ‪ ,W‬נריץ אותו תחילה עם ) ‪ (L(1) , W‬ונקבל את )‪ ,L(2‬ואז עם ) )‪ (L(2) , L(2‬ונקבל את‬
‫)‪ ,L(4‬ואז עם ) )‪ (L(4) , L(4‬ונקבל את )‪ L(8‬וכו'‪ ,‬אז נצטרך לחזור על הפעולה סדר גודל של )‪ log(n‬פעמים )במקום ‪ n‬פעמים(‪ ,‬שכן‬
‫בכל פעם אנחנו מכפילים את ‪:m‬‬

‫באופן זה נקבל שסיבוכיות הריצה תהיה ))‪ .O(n3 log(n‬נשים לב שסיבוכיות הפתרון עם בלמן פורד היא )|‪ ,O(n2 |E‬לכן רק אם‬
‫דרגת היציאה הממוצעת )מספר הקשתות הממוצע שיוצא מכל צומת בגרף( הוא מסדר גודל שגדול מ־)‪ ,log(n‬אז הפתרון הנ”ל יעיל‬
‫יותר מהפתרון עם בלמן פורד‪.‬‬

‫אלגוריתם פלויד־וורשאל )‪(Floyd-Warshall‬‬ ‫‪10.3‬‬


‫הגדרה ‪ 10.4‬נגדיר למסלול > ‪ p =< v1 , v2 , ..., vl‬את המושג צמתי ביניים‪ ,‬שיהיו כל הצמתים ב־‪ p‬שאינם ‪ v1‬או ‪) vl‬כלומר צמתי‬
‫הביניים של ‪ p‬הם } ‪.({v2 , ..., vl−1‬‬
‫)‪(k‬‬
‫באלגוריתם פלויד־וורשאל‪ ,‬לגרף מעל קבוצת הצמתים }‪ V = {1, 2, ..., n‬נגדיר את ‪ dij‬להיות משקל המסלול הקצר ביותר מ־‪ i‬ל־‪j‬‬
‫כך שצמתי הביניים שלו כולם מהקבוצה }‪ .{1, 2, ..., k‬הפתרון הרקורסיבי של האלגוריתם מתבסס על ההבחנה בין שני מקרים עבור‬
‫‪ p = i‬שצמתי הביניים שלו הם מהקבוצה }‪:{1, 2, ..., k‬‬ ‫מסלול ‪j‬‬

‫• אם ‪ k‬אינו צומת ביניים במסלול‪ :‬אז כל צמתי הביניים במסלול ‪ p‬הם מהקבוצה }‪.{1, 2, ..., k − 1‬‬
‫‪p1‬‬ ‫‪p2‬‬
‫‪ .p = i‬כיוון שאין מעגלים במק”ב‪ k ,‬אינו צומת ביניים‬ ‫‪k‬‬ ‫• אם ‪ k‬כן צומת ביניים במסלול‪ :‬אז ניתן לפרק את ‪ p‬כך ־ ‪j‬‬
‫ב־ ‪ p1‬או ב־ ‪) p2‬כי אחרת הוא חוזר פעמיים ב־‪ ,p‬ובפרט יהיה מעגל(‪ .‬לכן קיבלנו כי ‪ p‬מורכב למעשה מסכום המשקלים של‬
‫‪ k‬שצמת הביניים שלו מהקבוצה }‪.{1, 2, ..., k − 1‬‬ ‫‪ i‬שצמתי הביניים שלו מהקבוצה }‪ ,{1, 2, ..., k − 1‬ומסלול ‪j‬‬ ‫מסלול ‪k‬‬
‫)‪(k‬‬
‫לפי הבחנה זו‪ ,‬נוכל להגדיר רקורסיבית את ‪ dij‬באופן הבא‪:‬‬
‫(‬
‫)‪(k‬‬ ‫‪wij‬‬ ‫‪if k = 0‬‬
‫‪dij‬‬ ‫=‬ ‫)‪(k−1) (k−1‬‬ ‫)‪(k−1‬‬
‫‪min(dij‬‬ ‫‪, dik‬‬ ‫‪+ dkj ) if k ≥ 1‬‬

‫)‪(0‬‬
‫הערה ‪ dij 10.5‬הוא אורך המק”ב מ־‪ i‬ל־‪ j‬שכל צומת ביניים ‪ x‬שלו מקיים כי ‪ ,1 ≤ x ≤ 0‬לכן זו הקבוצה הריקה‪ .‬כלומר‪ ,‬מדובר‬
‫במק”ב שאין בו כלל צמתי ביניים‪ ,‬לכן משקלו פשוט שווה ל־ ‪.wij‬‬

‫‪43‬‬
‫האלגוריתם‬ ‫‪10.3.1‬‬

‫ניתוח סיבוכיות‬ ‫‪10.3.2‬‬


‫שלוש לולאות ה־‪ for‬המקוננות )שורות ‪6‬־‪ (3‬מביאות אותנו ל־) ‪ ,O(n3‬והפעם‪ ,‬במקום לעשות מינימום על ‪ k‬איברים כמו באלגוריתם‬
‫הקודם‪ ,‬אנחנו מבצעים מינימום על מספר קבוע של ערכים ב־)‪) O(1‬שורה ‪ ,(7‬לכן הסיבוכיות הכוללת היא ) ‪.O(n3‬‬

‫האלגוריתם של ג'ונסון עבור גרפים דלילים )‪(Johnson's Algorithm for Sparse Graphs‬‬ ‫‪10.4‬‬
‫נתון גרף )‪ G = (V, E‬מכוון וממושקל‪ ,‬פונקצית משקל ‪ ,w : E → R‬ופונקציה כלשהי ‪ .h : V → R‬עבור כל קשת ‪(u, v) ∈ E‬‬
‫נגדיר‪:‬‬

‫)‪ŵ(u, v) = w(u, v) + h(u) − h(v‬‬

‫נשים לב כי עבור מסלול > ‪ p =< v0 , v1 , ..., vk‬מתקיים‪:‬‬

‫) ‪ŵ(p) = w(v0 , v1 ) + h(v0 ) − h(v1 ) + w(v1 , v2 ) + h(v1 ) − h(v2 ) + ... + w(vk−1 , vk ) + h(vk−1 ) − h(vk‬‬
‫) ‪= w(v0 , v1 ) + w(v1 , v2 ) + ... + w(vk−1 , vk ) + h(v0 ) − h(vk‬‬
‫) ‪= w(p) + h(v0 ) − h(vk‬‬

‫‪k‬‬
‫‪P‬‬
‫= )‪.(w(p‬‬ ‫)כי ה־) ‪ h(vi‬מצטמצמים טלסקופית‪ ,‬ו־) ‪w(vi−1 , vi‬‬
‫‪i=1‬‬

‫הערה ‪10.6‬‬
‫• מכאן נובע שאילו ‪ p‬מק”ב לפי ‪ w‬אזי הוא גם מק”ב לפי ̂‪) w‬שכן כפי שראינו כעת משקלי המסלולים נבדלים רק בקבוע‬
‫) ‪.(h(v0 ) − h(vk‬‬
‫• כמו כן‪ ,‬אילו ‪ p‬מעגל שלילי לפי ‪ w‬אזי הוא גם מעגל שלילי לפי ̂‪) w‬שכן במצב שבו ‪ p‬הוא מעגל מתקיים ‪ ,v0 = vk‬ונקבל‬
‫שהקבוע ‪ ,h(v0 ) − h(vk ) = h(v0 ) − h(v0 ) = 0‬כך שמתקבל השיוויון )‪.(ŵ(p) = w(p‬‬

‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪10.4.1‬‬


‫כעת‪ ,‬אילו נוכל לבחור ‪ h : V → R‬עבורה ‪ ŵ(u, v) ≥ 0‬לכל ‪ ,(u, v) ∈ E‬אז נוכל להריץ את האלגוריתם של דייקסטרה עם ̂‪w‬‬
‫ולקבל סיבוכיות של )|‪.O(|V |2 log(|V |) + |V ||E‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫בהנתן גרף )‪ G = (V, E‬מכוון וממושקל עם ‪ ,w : E → R‬ניצור גרף חדש ) ‪ G = (V , E‬ע”י הוספת הצומת ‪ ,s‬וחיבורה לכל‬
‫צומת אחר בגרף בקשת ממשקל ‪ .0‬כיוון שמ־‪ s‬יש רק קשתות יוצאות‪ ,‬אז אם אין מעגלים שליליים ב־‪ G‬אין מעגלים שליליים גם‬
‫ב־ ‪ ,G0‬וכן אם ‪ s‬צומת במק”ב הוא בהכרח צומת המקור )לא יכול להיות באמצע המסלול כי אין קשתות נכנסות ל־‪.(s‬‬
‫נגדיר את הפונקציה ‪ h : V 0 → R‬להיות )‪ h(v) = δ(s, v‬לכל ‪ .v ∈ V 0‬מאי־שיוויון המשולש מתקיים כי‬
‫)‪ ,δ(s, v) ≤ δ(s, u) + w(u, v‬לכן )‪ ,h(v) ≤ h(u) + w(u, v‬ומהעברת )‪ h(v‬אגף נקבל כי‪:‬‬

‫‪ŵ(u, v) = w(u, v) + h(u) − h(v) ≥ 0‬‬

‫כעת‪ ,‬נוכל להריץ את אלגוריתם בלמן־פורד על ‪ G0‬מ־‪ s‬עם ‪ .w‬אילו קיבלנו כי יש מעגל שלילי‪ ,‬נתריע על כך‪ .‬אחרת‪ ,‬נשתמש‬
‫בערכי ‪ δ‬ע”מ להגדיר את ‪ .h‬עתה נוכל להשתמש ב־̂‪ w‬ולהריץ את האלגוריתם של דייקסטרה ‪ n‬פעמים על הגרף על מנת למצוא את‬
‫כל המסלולים הקצרים ביותר‪ ,‬שכן פונקציית המשקל ̂‪ w‬היא אי־שלילית‪.‬‬

‫‪44‬‬
‫האלגוריתם‬ ‫‪10.4.2‬‬

‫דוגמת הרצה‬ ‫‪10.4.3‬‬

‫ניתוח סיבוכיות‬ ‫‪10.4.4‬‬


‫אנחנו מריצים פעם אחת את האלגוריתם של בלמן־פורד ב־)|‪ .O(|V ||E‬לאחר מכן מריצים ‪ n‬פעמים דייקסטרה‬
‫ב־)|‪ .O(|V |log(|V |) + |E‬לכן הסיבוכיות הכוללת היא )|‪ ,O(|V |2 log(|V |) + |V ||E|) = O(n2 log(n) + n|E‬שזה בכל מקרה‬

‫‪45‬‬
‫אסימפטוטית לכל היותר ) ‪ .O(n3‬אם הגרף דליל‪ ,‬כמובן ש־) ‪ ,n2 log(n) + n|E| = o(n3‬כך שזה יעיל יותר‪ .‬נציין שהקבועים‬
‫באלגוריתם זה הם גדולים יותר מאשר באלגוריתם של פלויד־וורשאל‪ ,‬וכן אלגוריתם פלויד־וורשאל הרבה יותר פשוט‪ ,‬לכן אם הגרף‬
‫צפוף‪ ,‬בפועל כנראה שנעדיף להשתמש בו )על אף שאסמפטוטית בקורס זה האלגוריתם של ג'ונסון תמיד עדיף(‪.‬‬

‫‪46‬‬
‫‪ (Maximum‬־ פרק‬ ‫זרימה מקסימלית ורשתות זרימה )‪Flow and Flow Networks‬‬ ‫‪11‬‬
‫‪ 26‬בספר‬
‫הקדמה ־ רשתות זרימה וזרימות‬ ‫‪11.1‬‬
‫הגדרה ‪ 11.1‬רשת זרימה היא גרף מכוון )‪ G = (V, E‬שבו כל קשת ‪ (u, v) ∈ E‬היא בעלת קיבול )‪ (capacity‬אי־שלילי ‪.c(u, v) > 0‬‬
‫∈ )‪ (u, v‬אנחנו מניחים כי ‪ .c(u, v) = 0‬כמו כן‪ ,‬ישנם שני צמתים מיוחדים ־ מקור )‪ ,(source‬מסומן ב־‪ ,s‬ובור )‪ ,(sink‬מסומן‬‫אם ‪/ E‬‬
‫‪ .(s‬בנוסף‪ ,‬נניח שאין בגרף קשתות‬ ‫‪v‬‬ ‫ב־‪ .t‬כל צומת בגרף נמצא במסלול מהמקור אל הבור )כלומר‪ ,‬לכל ‪ v ∈ V‬קיים מסלול ‪t‬‬
‫אנטי־מקבילות ))‪ (u, v‬וגם )‪.((v, u‬‬

‫הערה ‪ 11.2‬נובע מהנ”ל שהגרף קשיר‪ ,‬ומתקיים ‪.|E| ≥ |V | − 1‬‬

‫הגדרה ‪ 11.3‬תהי )‪ G = (V, E‬רשת זרימה )עם פונ' קיבול ‪ ,c‬מקור ‪ ,s‬ובור ‪ .(t‬זרימה )‪ (ow‬ב־‪ G‬היא פונקציה ממשית → ‪f : V × V‬‬
‫‪ R‬המקיימת את התכונות הבאות‪:‬‬

‫‪ .1‬אילוצי קיבול )‪ :(capacity constraints‬לכל ‪ u, v ∈ V‬מתקיים )‪.0 ≤ f (u, v) ≤ c(u, v‬‬


‫‪ .2‬שימור הזרימה )‪ :(ow conservation‬לכל }‪ ,u ∈ V \{s, t‬נדרוש כי )‪f (v, u‬‬
‫‪P‬‬ ‫‪P‬‬
‫‪.‬‬ ‫= )‪f (u, v‬‬
‫‪v∈V‬‬ ‫‪v∈V‬‬

‫הערה ‪ 11.4‬נסמן‪:‬‬

‫• )‪ f uv := f (u, v‬־ ערך הזרימה בקשת )‪.(u, v‬‬


‫‪P‬‬ ‫‪P‬‬
‫=‪ |f | :‬־ ערך הזרימה ברשת‪.‬‬ ‫‪fsv −‬‬ ‫• ‪fvs‬‬
‫‪v∈V‬‬ ‫‪v∈V‬‬

‫דוגמה לרשת זרימה‪:‬‬


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

‫הערה ‪ 11.5‬ההנחות הבאות לגבי רשת הזרימה אינן מגבילות את הכלליות‪:‬‬


‫• אין קשתות אנטי־מקבילות ־ נניח בה”כ שאין בגרף זוג קשתות אנטי מקבילות ) ‪ (v1 , v2‬ו־) ‪ .(v2 , v1‬נוכל להניח זאת שכן אם‬
‫יש בגרף קשתות ) ‪ (v1 , v2‬ו־) ‪ ,(v2 , v1‬כך ש־ ‪ cv1 v2‬ו־ ‪ cv2 v1‬הם אילוצי הקיבול בהתאמה‪ ,‬אזי נוכל להוסיף צומת ‪ ,v 0‬ולהחליף‬
‫את הקשת ) ‪ (v1 , v2‬בקשתות ) ‪ ,(v1 , v 0 ), (v 0 , v2‬ולהגדיר ‪ .cv2 v1 = cv1 v0 = cv0 v2‬באופן זה אילוצי הקיבול נשמרים‪.‬‬

‫‪47‬‬
‫• יש מקור ובור יחידים ־ נניח בה”כ שיש בגרף מקור ובור יחידים‪ .‬נוכל להניח זאת שכן אחרת‪ ,‬אילו יש מספר מקורות ומספר‬
‫בורות )יעדים(‪ ,‬אזי נוכל להוסיף זוג צמתים ”מקור־על” ו”בור־על”‪ ,‬ולחבר את מקור־העל אל כל המקורות‪ ,‬ואת בור־העל לכל‬
‫הבורות‪ ,‬וכך נקבל גרף עם מקור יחיד ובור יחיד‪ ,‬כדרוש‪.‬‬

‫‪ u, v‬הקיבול השיורי בקשת מוגדר כך‪:‬‬ ‫הגדרה ‪ 11.6‬נתונה רשת )‪ G = (V, E‬וזרימה ‪ .f‬עבור ‪∈ V‬‬
‫‪‬‬
‫‪cuv − fuv‬‬
‫‪‬‬ ‫‪(u, v) ∈ E‬‬
‫‪cf (u, v) = fvu‬‬ ‫‪(v, u) ∈ E‬‬
‫‪‬‬
‫‪0‬‬ ‫‪otherwise‬‬
‫‪‬‬

‫כלומר‪:‬‬

‫• עבור קשת בגרף‪ ,‬הקיבול השיורי שווה לקיבול פחות ערך הזרימה )”כמה ניתן עוד להזרים”(‪.‬‬
‫• עבור הקשת ההפוכה‪ ,‬הקיבול השיורי שווה לערך הזרימה בקשת שבגרף )”כמה ניתן להזרים באופן מנוגד” שזה כמובן שווה‬
‫לכמות שאנו מזרימים כרגע ־ ”כמה זרימה יש שניתן לבטל”(‪.‬‬

‫הגדרה ‪ 11.7‬הרשת השיורית ) ‪ Gf = (V, Ef‬מוגדרת ע”י }‪ .Ef = {(u, v) ∈ V × V : cf (u, v) > 0‬כל קשת )‪ (u, v‬ב־ ‪ Ef‬נקראת‬
‫קשת שיורית‪ ,‬וקיבולה הוא )‪.cf (u, v‬‬

‫הערה ‪ 11.8‬נשים לב שלכל קשת )‪ (u, v‬בגרף ‪ G‬יכולות להיות לכל היותר שתי קשתות שיוריות מתאימות ב־ ‪ Gf‬־ הקשת )‪ (u, v‬אם‬
‫‪ ,cuv 6= fuv‬והקשת )‪ (v, u‬אם ‪ .fuv 6= 0‬לכן תמיד יתקיים |‪ .|Ef | ≤ 2|E‬כמו כן‪ ,‬נבחין כי גם ‪ Gf‬מהווה בעצמה רשת זרימה‪.‬‬

‫הגדרה ‪ 11.9‬תהי ‪ f‬זרימה ב־‪ ,G‬ותהי ‪ f 0‬זרימה ב־ ‪ .Gf‬הגדלה )‪ (augmentation‬של הזרימה ‪ f‬ב־ ‪ f 0‬היא פונקציה‬
‫‪ (f ↑ f 0 ) : V × V → R‬המוגדרת באופן הבא‪:‬‬
‫(‬
‫‪0‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪fuv + fuv‬‬ ‫‪− fvu‬‬ ‫‪(u, v) ∈ E‬‬
‫= )‪(f ↑ f )(u, v‬‬
‫‪0‬‬ ‫‪otherwise‬‬

‫הגדרה ‪ 11.10‬תהי רשת )‪ G = (V, E‬וזרימה ‪ f‬בה‪ .‬מסלול מגדיל )‪ p (augmenting path‬הוא מסלול פשוט מ־‪ s‬ל־‪ t‬ב־ ‪ .Gf‬הקיבול‬
‫השיורי של ‪ p‬מוגדר להיות‪:‬‬

‫}‪cf (p) = min{cf (u, v) : (u, v) ∈ p‬‬

‫‪48‬‬
‫דוגמה לרשת שיורית ולהגדלה‪:‬‬

‫• איור )‪ (a‬־ רשת הזרימה ‪ G‬עם זרימה ‪.f‬‬


‫• איור )‪ (b‬־ הרשת השיורית ‪ ,Gf‬עם מסלול מגדיל ‪ p‬מודגש‪ .‬הקיבול השיורי במסלול זה הוא ‪.cf (p) = cf (v2 , v3 ) = 4‬‬

‫• איור )‪ (c‬־ הזרימה ב־‪ G‬כתוצאה מהגדלה לאורך מסלול ‪ p‬בקיבול השיורי שלו‪) 4 ,‬הסימון על הקשת ) ‪ (v3 , v2‬מעיד על כך‬
‫שהקיבול הוא ‪ ,9‬ואין זרימה בקשת כלל(‪.‬‬
‫• איור )‪ (d‬־ הרשת השיורית המתקבלת מהשינוי שנעשה באיור )‪.(c‬‬

‫‪(The‬‬ ‫שיטת פורד־פולקרסון )‪Ford-Fulkerson Method‬‬ ‫‪11.2‬‬


‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪11.2.1‬‬
‫מאתחלים את רשת הזרימה לזרימה ‪ 0‬בכל הקשתות‪ .‬לאחר מכן באופן איטרטיבי‪ ,‬בכל פעם מוצאים מסלול מ־‪ s‬ל־‪ t‬ברשת השיורית‬
‫)למשל עם ‪ ,(DFS‬זה מסלול מגדיל‪ .‬מגדילים את ‪ f‬בהתאם למסלול שמצאנו‪ ,‬עד שלא נותר מסלול מגדיל‪ ,‬ואז ‪ f‬זרימה מקסימלית‪:‬‬

‫האלגוריתם הבסיסי‬ ‫‪11.2.2‬‬


‫להלן האלגוריתם הבסיסי של שיטת פורד־פולקרסון‪:‬‬

‫‪49‬‬
‫הוכחת נכונות‬ 11.2.3
‫ היא‬f ↑ f 0 ‫ אזי‬.Gf ‫ זרימה ב־‬f 0 ‫ הרשת השיורית ותהי‬Gf ‫ תהי‬.f ‫ רשת זרימה עם זרימה‬G = (V, E) ‫( תהי‬1 ‫ )למה‬11.11 ‫למה‬
.|f ↑ f 0 | = |f | + |f 0 | ‫ וערכה‬G‫זרימה ב־‬

:‫ לשם כך‬.G‫ זרימה ב־‬f ↑ f 0 ‫ תחילה נוכיח כי‬:‫הוכחה‬


:(0 ≤ (f ↑ f 0 )(u, v) ≤ c(u, v) ‫ מתקיים‬u, v ∈ V ‫ נוכיח כי מתקיימים אילוצי הקיבול )כלומר שלכל‬.1
0
‫ כך שסך הכל קיבלנו כי‬,fvu ≤ cf (v, u) ‫ לכן‬Gf ‫ זרימה ב־‬f 0 ,‫ כמו כן‬.cf (v, u) = fuv ‫ לכן‬,G‫ זרימה ב־‬f .(u, v) ∈ E ‫תהי‬
0
:‫ כעת‬.fvu ≤ fuv

(f ↑ f 0 )(u, v) = fuv + fuv


0 0
− fvu 0
≥ fuv + fuv 0
− fuv = fuv ≥0
(f ↑ f 0 )(u, v) = fuv + fuv
0 0
− fvu 0
≤ f + fuv ≤ fuv + cf (u, v) = fuv + cuv − fuv = cuv
|{z} uv |{z} | {z }
0 ≥0
fvu 0 ≤c (u,v)
fuv f cf (u,v)

.‫ כדרוש‬0 ≤ (f ↑ f 0 )(u, v) ≤ cuv ‫סך הכל קיבלנו‬


(f ↑ f 0 )(u, v) − (f ↑ f 0 )(v, u) = 0 ‫ מתקיים‬,u ∈ V \{s, t} ‫ נוכיח כי מתקיים שימור הזרימה )כלומר שלכל‬.2
P P
:(
v∈V v∈V
.(u, v), (v, u) ∈ E‫ כך ש־‬v, u ∈ V ‫ לכן אין‬,‫ אין קשתות אנטי־מקבילות‬G‫ב־‬
.V1 (u) ∩ V2 (u) = ∅ ‫ אזי‬.V1 (u) = {v : (u, v) ∈ E}, V2 (u) = {v : (v, u) ∈ E} :‫ נגדיר‬u ∈ V ‫לכל‬
(∗) P 0 P 0 (∗∗)
fvu = 0 ‫ מתקיים‬u ∈ V \{s, t} ‫ מקיימות שימור זרימה הרי שלכל‬f, f 0 ‫כיוון ש־‬
P P
, fuv − fvu = 0, fuv −
v∈V v∈V v∈V v∈V
:‫לכן‬
X X X X X
(f ↑ f 0 )(u, v) − (f ↑ f 0 )(v, u) = (f ↑ f 0 )(u, v) − (f ↑ f 0 )(v, u) ( (f ↑ f 0 )(u, v) = 0, as v ∈ V2 (u) ⇒ (u, v) ∈
/ E,
v∈V v∈V v∈V1 (u) v∈V2 (u) v∈V2
X
(f ↑ f 0 )(v, u) = 0, as v ∈ V1 (u) ⇒ (v, u) ∈
/ E)
v∈V1
X X
0 0 0 0
= (fuv + fuv − fvu )− (fvu + fvu − fuv )
v∈V1 (u) v∈V2 (u)
X X
= fuv − fvu
v∈V1 (u) v∈V2 (u)
X X
0 0
+ fuv + fuv (order changes)
v∈V1 (u) v∈V2 (u)
X X
0 0
− fvu − fvu
v∈V1 (u) v∈V2 (u)

X X
= fuv − fvu
v∈V1 (u) v∈V2 (u)
X
0
+ fuv (unif y the sums, as V1 (u) ∩ V2 (u) = ∅)
v∈V1 (u)∪V2 (u)
X
0
− fvu
v∈V1 (u)∪V2 (u)

X X X X
0 0
= fuv − fvu + fuv − fvu
v∈V v∈V v∈V v∈V
| {z } | {z }
=0 (∗) =0 (∗∗)

=0
0
(f ↑ f 0 )(u, v) = (f ↑ f 0 )(v, u) ‫קיבלנו כי‬
P P
.‫ כדרוש‬,G‫ היא זרימה ב־‬f ↑ f ‫ ומכאן ש־‬,‫ לכן מתקיים שימור הזרימה‬,
v∈V v∈V

:|f ↑ f 0 | = |f | + |f 0 | ‫ כעת נוכיח כי ערכה‬.3


.(s, v), (v, s) ∈ E ‫ עם‬v ∈ V ‫ לכן אין‬,‫ אין קשתות אנטי־מקבילות‬G‫ ב־‬,‫בדומה להוכחה הקודמת‬
.V1 ∩ V2 = ∅ ‫ אזי‬.V1 = {v : (s, v) ∈ E}, V2 = {v : (v, s) ∈ E} :‫נגדיר‬

50
‫כעת‪ ,‬לפי ההגדרה של ערך הזרימה ברשת‪:‬‬
‫‪X‬‬ ‫‪X‬‬
‫= | ‪|f ↑ f 0‬‬ ‫‪(f ↑ f 0 )(s, v) −‬‬ ‫)‪(f ↑ f 0 )(v, s‬‬
‫‪v∈V‬‬ ‫‪v∈V‬‬
‫‪X‬‬ ‫‪X‬‬
‫‪0‬‬
‫=‬ ‫‪(f ↑ f )(s, v) −‬‬ ‫)‪(f ↑ f 0 )(v, s‬‬
‫‪v∈V1‬‬ ‫‪v∈V2‬‬
‫‪X‬‬ ‫‪X‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫=‬ ‫‪(fsv +‬‬ ‫‪fsv‬‬ ‫‪−‬‬ ‫‪fvs‬‬ ‫)‬ ‫‪−‬‬ ‫‪(fvs + fvs‬‬ ‫‪− fsv‬‬ ‫)‬
‫‪v∈V1‬‬ ‫‪v∈V2‬‬
‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫=‬ ‫‪fsv +‬‬ ‫‪fsv‬‬ ‫‪−‬‬ ‫‪fvs‬‬ ‫‪−‬‬ ‫‪fvs −‬‬ ‫‪fvs‬‬ ‫‪+‬‬ ‫‪fsv‬‬
‫‪v∈V1‬‬ ‫‪v∈V1‬‬ ‫‪v∈V1‬‬ ‫‪v∈V2‬‬ ‫‪v∈V2‬‬ ‫‪v∈V2‬‬
‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫=‬ ‫‪fsv −‬‬ ‫‪fvs +‬‬ ‫‪fsv‬‬ ‫‪+‬‬ ‫‪fsv‬‬ ‫‪−‬‬ ‫‪fvs‬‬ ‫‪−‬‬ ‫‪fvs‬‬ ‫)‪(order changes‬‬
‫‪v∈V1‬‬ ‫‪v∈V2‬‬ ‫‪v∈V1‬‬ ‫‪v∈V2‬‬ ‫‪v∈V1‬‬ ‫‪v∈V2‬‬
‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬
‫‪0‬‬ ‫‪0‬‬
‫=‬ ‫‪fsv −‬‬ ‫‪fvs +‬‬ ‫‪fsv‬‬ ‫‪−‬‬ ‫‪fvs‬‬ ‫) ‪(f or the last f our, same as sum over V1 ∪ V2‬‬
‫‪v∈V1‬‬ ‫‪v∈V2‬‬ ‫‪v∈V1 ∪V2‬‬ ‫‪v∈V1 ∪V2‬‬
‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬
‫‪0‬‬ ‫‪0‬‬
‫=‬ ‫‪fsv −‬‬ ‫‪fvs +‬‬ ‫‪fsv‬‬ ‫‪−‬‬ ‫‪fvs‬‬ ‫) ‪(same as sum over V‬‬
‫‪v∈V‬‬ ‫‪v∈V‬‬ ‫‪v∈V‬‬ ‫‪v∈V‬‬

‫| ‪= |f | + |f 0‬‬

‫למה ‪) 11.12‬למה ‪ (2‬תהי )‪ G = (V, E‬רשת זרימה עם זרימה ‪ .f‬יהי ‪ p‬מסלול מגדיל ב־ ‪ .Gf‬נגדיר פונקציה ‪ fp : V × V → R‬באופן‬
‫הבא‪:‬‬
‫(‬
‫‪cf (p) (u, v) ∈ p‬‬
‫= )‪fp (u, v‬‬
‫‪0‬‬ ‫‪otherwise‬‬

‫אזי ‪ fp‬זרימה ב־ ‪ Gf‬וערכה ‪.|fp | = cf (p) > 0‬‬


‫הוכחה‪ :‬תרגיל‪.‬‬

‫מסקנה ‪) 11.13‬מסקנה ‪ (3‬תהי )‪ G = (V, E‬רשת זרימה עם זרימה ‪ .f‬יהי ‪ p‬מסלול מגדיל ב־ ‪ .Gf‬נגדיר ‪ fp‬כמו בלמה ‪ .2‬אם‬
‫מגדילים את ‪ f‬ב־ ‪ fp‬אזי ‪ f ↑ fp‬היא זרימה ב־‪ ,G‬וערכה | ‪) |f ↑ fp | = |f | + |fp | > |f‬נובע מיידית משתי הלמות הקודמות(‪.‬‬

‫הערה ‪ 11.14‬נשים לב שנובע מכך כי אילו הערכים שלנו כולם שלמים‪ ,‬אז אלגוריתם פורד־פולקרסון בהכרח מגדיל את ‪ f‬לפחות ב־‪1‬‬
‫בכל מעבר על מסלול מגדיל‪ .‬מכאן נובע גם כי מספר הפעמים שנמצא מסלול מגדיל ≥ | ‪.|fmax‬‬

‫הגדרה ‪ 11.15‬חתך ) ‪ (S, T‬ברשת )‪ G = (V, E‬הוא חלוקה של ‪ V‬ל־‪ S‬ול־‪ ,T = V \S‬כך ש־ ‪.s ∈ S, t ∈ T‬‬

‫הערה ‪ 11.16‬לכל אחד מהצמתים שאינם ‪ s, t‬ניתן לבחור באיזה צד של החתך הם נמצאים‪ ,‬לכן יש ‪ 2|V |−2‬חתכים אפשריים‪.‬‬

‫הגדרה ‪ 11.17‬עבור זרימה ‪ ,f‬הזרימה נטו )‪ (netow‬דרך החתך מוגדרת באופן הבא‪:‬‬
‫‪XX‬‬ ‫‪XX‬‬
‫= ) ‪f (S, T‬‬ ‫‪fuv −‬‬ ‫‪fvu‬‬
‫‪u∈S v∈T‬‬ ‫‪u∈S v∈T‬‬

‫הגדרה ‪ 11.18‬הקיבול של חתך ) ‪ (S, T‬מוגדר באופן הבא‪:‬‬


‫‪XX‬‬
‫= ) ‪c(S, T‬‬ ‫‪cuv‬‬
‫‪u∈S v∈T‬‬

‫‪51‬‬
‫לדוגמה‪:‬‬

‫עבור }‪ ,S = {s, v1 , v2 }, T = {v3 , v4 , t‬הזרימה נטו והקיבול של החתך הם‪:‬‬

‫‪f (S, T ) = fv2 v4 + fv1 v3 − fv3 v2 = 11 + 12 − 4 = 19‬‬


‫‪c(S, T ) = cv2 v4 + cv1 v3 = 14 + 12 = 26‬‬

‫למה ‪) 11.19‬למה ‪ (4‬תהי ‪ f‬זרימה ב־‪ .G‬עבור חתך ) ‪ (S, T‬הזרימה נטו דרך החתך מקיימת | ‪.f (S, T ) = |f‬‬
‫הוכחה‪:‬‬
‫‪X‬‬ ‫‪X‬‬
‫= | ‪|f‬‬ ‫‪fsv −‬‬ ‫‪fvs‬‬
‫‪v∈V‬‬ ‫‪v∈V‬‬
‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬
‫=‬ ‫‪fsv −‬‬ ‫‪fvs +‬‬ ‫(‬ ‫‪f uv −‬‬ ‫) ‪f vu‬‬
‫‪v∈V‬‬ ‫‪v∈V‬‬ ‫‪u∈S\{s} v∈V‬‬ ‫‪v∈V‬‬
‫|‬ ‫‪{z‬‬ ‫}‬
‫)∗( ‪=0‬‬
‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬ ‫‪X‬‬
‫=‬ ‫‪(fsv +‬‬ ‫‪fuv ) −‬‬ ‫‪(fvs +‬‬ ‫) ‪fvu‬‬
‫‪v∈V‬‬ ‫}‪u∈S\{s‬‬ ‫‪v∈V‬‬ ‫}‪u∈S\{s‬‬
‫‪XX‬‬ ‫‪XX‬‬
‫=‬ ‫‪fuv −‬‬ ‫‪fvu‬‬ ‫)‪(sum over everything but s, plus s, gives sum over everything‬‬
‫‪v∈V u∈S‬‬ ‫‪v∈V u∈S‬‬
‫‪XX‬‬ ‫‪XX‬‬ ‫‪XX‬‬ ‫‪XX‬‬
‫(=‬ ‫‪fuv −‬‬ ‫( ‪fvu ) +‬‬ ‫‪fuv −‬‬ ‫) ‪fvu‬‬ ‫)∅ = ‪(split V to S, T using : S ∪ T = V, S ∩ T‬‬
‫‪v∈T u∈S‬‬ ‫‪v∈T u∈S‬‬ ‫‪v∈S u∈S‬‬ ‫‪v∈S u∈S‬‬
‫|‬ ‫‪{z‬‬ ‫}‬
‫)∗∗( ‪=0‬‬
‫‪XX‬‬ ‫‪XX‬‬
‫=‬ ‫‪fuv −‬‬ ‫‪fvu‬‬
‫‪v∈T u∈S‬‬ ‫‪v∈T u∈S‬‬
‫) ‪= f (S, T‬‬

‫‪P‬‬ ‫‪P‬‬ ‫הערה ‪ 11.20‬הסברים‪:‬‬


‫‪ ,‬וסך‬ ‫‪f uv −‬‬ ‫)∗( ־ כל צומת ‪ u 6= s‬שנמצא ב־‪) S‬לכן גם ‪ ,u 6= t‬כי ‪ t‬שייך ל־ ‪ ,T‬לא ל־‪ (S‬מקיים שימור זרימה‪ ,‬לכן ‪f vu = 0‬‬
‫‪v∈V‬‬ ‫‪v∈V‬‬ ‫‪P‬‬ ‫‪P‬‬ ‫‪P‬‬
‫‪.‬‬ ‫(‬ ‫‪f uv −‬‬ ‫הכל ‪f vu ) = 0‬‬
‫‪u∈S\{s} v∈V‬‬ ‫‪v∈V‬‬
‫)∗∗( ־ נבחין כי כיוון שאנחנו עוברים על זוגות ‪ u, v ∈ S‬כך שפעם אחת הם מופיעים בסימן ‪ +‬בסכום השמאלי בתור ‪ ,fuv‬ופעם‬
‫אחת בסימן ‪ −‬בסכום הימני בתור ‪) fvu‬כאשר הפעם ‪ v‬בתפקיד ‪ u‬ו־‪ u‬בתפקיד ‪ ,(v‬הרי שתמיד הסכומים יתבטלו‪ ,‬ונקבל שסך הכל‬
‫הביטוי כולו שווה ‪ .0‬למשל עבור זוג ‪ v1 , v2 ∈ S‬פעם אחת נוסיף את ‪) fuv = fv1 v2‬עבור ‪ ,(v = v2 , u = v1‬ופעם אחרת נחסר את‬
‫‪) fvu = fv1 v2‬עבור ‪.(v = v1 , u = v2‬‬

‫מסקנה ‪) 11.21‬מסקנה ‪ (5‬לכל זרימה ‪ f‬ולכל חתך ) ‪ (S, T‬מתקיים ) ‪.|f | ≤ c(S, T‬‬
‫הוכחה‪:‬‬
‫‪XX‬‬ ‫‪XX‬‬ ‫‪XX‬‬ ‫‪XX‬‬
‫= ) ‪|f | = f (S, T‬‬ ‫‪fuv −‬‬ ‫≤ ‪fvu‬‬ ‫‪fuv‬‬ ‫≤‬ ‫) ‪cuv = c(S, T‬‬
‫}‪|{z‬‬ ‫}‪|{z‬‬
‫‪v∈T u∈S‬‬ ‫‪v∈T u∈S‬‬ ‫‪fvu≥0 v∈T u∈S‬‬ ‫‪fuv ≤cuv v∈T u∈S‬‬

‫‪52‬‬
‫‪ (Max-ow‬אם ‪ f‬זרימה ב־‪ G‬אזי התנאים הבאים שקולים‪:‬‬ ‫)משפט ‪ 6‬־ ‪min-cut theorem‬‬ ‫משפט ‪11.22‬‬

‫‪ f .1‬זרימה מקסימלית‬

‫‪ .2‬ברשת השיורית אין מסלול מגדיל‬


‫‪ |f | = c(S, T ) .3‬עבור חתך כלשהו ב־‪G‬‬

‫הוכחה‪ :‬נוכיח ‪ :2 ⇐ 1‬נניח ‪ f‬מקסימלית‪ ,‬ונניח בשלילה שיש מסלול מגדיל ‪ p‬ב־ ‪ .Gf‬ממסקנה ‪ 3‬נובע כי ‪ f ↑ fp‬היא זרימה בערך‬
‫גדול ממש מ־| ‪ ,|f‬בסתירה לכך ש־ ‪ f‬מקסימלית‪.‬‬
‫נוכיח ‪ :3 ⇐ 2‬נניח כי ברשת השיורית ‪ Gf‬אין מסלול מגדיל‪ .‬כלומר‪ ,‬נניח שאין מסלול מ־‪ s‬ל־‪ t‬ב־ ‪) Gf‬מההגדרה של מסלול‬
‫מגדיל(‪ .‬נגדיר‪:‬‬

‫‪S = {v ∈ V : there exists s‬‬ ‫‪v in Gf }, T = V \S‬‬

‫‪ ,s‬הרי שקיבלנו כי ‪ ,s ∈ S, t ∈ T‬כך ש־) ‪ (S, T‬מהווה‬ ‫‪ ,s‬וכן הנחנו שלא קיים מסלול ‪t‬‬ ‫נבחין כי כיוון שתמיד קיים מסלול ‪s‬‬
‫חתך‪.‬‬
‫נקח ‪ .u ∈ S, v ∈ T‬נחלק למקרים‪:‬‬
‫∈ )‪ ,(u, v‬ונקבל כי ‪ .fuv = cuv‬אחרת אם ‪ ,(u, v) ∈ Ef‬היינו מקבלים סתירה‪ :‬מכך‬ ‫‪ .1‬אם ‪ :(u, v) ∈ E‬אז בהכרח ‪/ Ef‬‬
‫ש־‪) u ∈ S‬לכן הוא צומת נגיש מהמקור( ו־ ‪) v ∈ T‬לכן הוא אינו צומת נגיש מהמקור(‪ ,‬נובע כי אם היתה הקשת ‪,(u, v) ∈ Ef‬‬
‫אז היה צריך להתקיים ‪ v ∈ S‬גם כן‪ ,‬לפי הדרך שבה הגדרנו את הקבוצה ‪ ,S‬בסתירה לכך ש־‪.v ∈ T \S‬‬
‫כלומר קיבלנו כי לכל קשת מ־‪ S‬ל־ ‪ T‬מתקיים ‪.fuv = cuv‬‬
‫‪ .2‬אם ‪ :(v, u) ∈ E‬אז בהכרח ‪ ,fvu = 0‬שכן אחרת היינו מקבלים כי ‪ ,cf (u, v) = fvu > 0‬ואז הקשת ‪ ,(u, v) ∈ Ef‬וזה לא‬
‫ייתכן‪ ,‬מאותו טיעון כמו קודם‪.‬‬
‫כלומר קיבלנו כי לכל קשת מ־ ‪ T‬ל־‪ S‬מתקיים ‪.fvu = 0‬‬
‫‪ .3‬אחרת‪.fuv = fvu = 0 :‬‬
‫סך הכל נקבל כי‪:‬‬

‫}‪|f | |{z‬‬
‫) ‪= f (S, T‬‬
‫‪lemma 4‬‬
‫‪XX‬‬ ‫‪XX‬‬
‫=‬ ‫‪fuv −‬‬ ‫‪fvu‬‬
‫‪v∈T u∈S‬‬ ‫‪v∈T u∈S‬‬
‫‪XX‬‬
‫=‬ ‫‪cuv‬‬ ‫‪−‬‬ ‫‪0‬‬
‫}‪|{z‬‬
‫‪v∈T u∈S‬‬ ‫‪f rom case 2: fuv =0‬‬
‫|‬ ‫‪{z‬‬ ‫}‬
‫‪f rom case 1: fuv =cuv‬‬

‫) ‪= c(S, T‬‬

‫נוכיח ‪ :1 ⇐ 3‬ממסקנה ‪ 5‬לכל חתך ) ‪ (S, T‬מתקיים ) ‪ .|f | ≤ c(S, T‬לכן אם ) ‪ |f | = c(S, T‬אז בהכרח ‪ f‬מקסימלית‪.‬‬

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

‫‪53‬‬
‫דוגמת הרצה‬ ‫‪11.2.4‬‬

‫ניתוח סיבוכיות‬ ‫‪11.2.5‬‬


‫אלגוריתם פורד־פולקרסון הבסיסי הוא למעשה משפחה של אלגוריתמים‪ ,‬שכן הוא לא מכיל את ההגדרה לאופן בו מוצאים את‬
‫המסלול המגדיל‪ .‬למשל בדוגמה הבאה‪ ,‬אילו נבחר בכל פעם את המסלול המגדיל שעובר דרך הקשת )‪) (u, v‬או )‪ ((v, u‬נוכל להזרים‬
‫בכל פעם רק עוד יחידה אחת‪ ,‬כך שהאלגוריתם יבצע ‪ 2, 000, 000‬איטרציות‪ .‬לעומת זאת‪ ,‬אילו נבחר את המסלול המגדיל ‪s → u → t‬‬
‫בפעם הראשונה‪ ,‬אז נזרים דרכו ‪ 1, 000, 000‬יחידות‪ ,‬וישאר רק המסלול ‪ ,s → v → t‬שגם דרכו נזרים ‪ 1, 000, 000‬יחידות‪ ,‬ונסיים‬
‫לאחר ‪ 2‬איטרציות בלבד‪ .‬לכן לאופן הבחירה של המסלול המגדיל יש חשיבות רבה ביעילות האלגוריתם‪.‬‬

‫סך הכל‪ ,‬נקבל כי ללא הגדרה מסוימת לאופן בו מוצאים את המסלול המגדיל‪ ,‬אלגוריתם ממשפחה זו יכול לבצע )| ‪O(|fmax‬‬
‫איטרציות‪ ,‬כך שכל איטרציה דורשת )|‪ O(|E‬עבודה‪ ,‬לכן נקבל שהסיבוכיות הכוללת חסומה ב־)| ‪ O(|E||fmax‬אם כל המספרים‬
‫שלמים‪ .‬יש לציין כי אם נקח קיבולות לא שלמות‪ ,‬יכול להיות שהאלגוריתם לא יעבוד כלל )יחזיר את הערך הלא נכון(‪ ,‬או לא יסיים‬
‫לעולם‪.‬‬

‫אלגוריתם אדמונדס־קארפ )‪(Edmonds-Karp‬‬ ‫‪11.3‬‬


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

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

‫‪54‬‬
‫ניתוח סיבוכיות‬ ‫‪11.3.2‬‬
‫נוכיח מספר למות שיובילו אותנו לכך שהאלגוריתם מבצע )|‪ O(|V ||E‬הוספות זרימה )כלומר מציאת מסלול מגדיל והוספת הזרימה‬
‫בו לזרימה הנוכחית(‪.‬‬

‫למה ‪ 11.25‬יהיו רשת זרימה )‪ ,G = (V, E‬מקור ‪ s‬ובור ‪ .t‬אזי המרחק בקשתות ברשת השיורית ‪ Gf‬בין ‪ s‬ל־‪ ,v‬לכל }‪,v ∈ V \{s, t‬‬
‫לא יקטן בין איטרציות של אלגוריתם אדמונדס־קארפ )כלומר הוא יכול רק לגדול(‪.‬‬
‫הוכחה‪ :‬תהי רשת זרימה )‪ .G = (V, E‬נסמן ב־)‪ δf (s, v‬את המרחק )מספר הקשתות( בין צומת ‪ s‬לצומת ‪ v‬כלשהו‪.‬‬
‫נניח בשלילה כי במהלך הרצת אלגוריתם אדמונדס־קארפ קיימת איטרציה בה לאחר הוספת המסלול המגדיל‪ ,‬המרחק בין ‪s‬‬
‫לצומת }‪ v ∈ V \{s, t‬כלשהו קטן‪ .‬נסמן ב־ ‪ f‬את הזרימה לפני הוספת המסלול המגדיל בפעם הראשונה שמתקיים הנ”ל‪ ,‬וב־ ‪f 0‬‬
‫את הזרימה שהתקבלה לאחר ההוספה‪ .‬אזי אנו מניחים כי קיים ‪ v‬עבורו )‪) δf 0 (s, v) < δf (s, v‬וכן שבכל איטרציה קודמת‪ ,‬ולכל‬
‫‪ ,v‬התקיים עד כה )‪ .(δf 0 (s, v) ≥ δf (s, v‬אילו קיימים כמה צמתים עבורם מתקיים )‪ δf 0 (s, v) < δf (s, v‬לאחר הוספת הזרימה‬
‫באיטרציה זו‪ ,‬אז נבחר את ‪ v‬להיות הצומת שמרחקו מ־‪ s‬לאחר ההוספה‪ ,δf 0 (s, v) ,‬הוא מינימלי‪.‬‬
‫‪,(s‬‬ ‫כעת נסמן ב־‪ u‬את הצומת שלפני ‪ v‬במק”ב מ־‪ s‬ברשת השיורית ‪) Gf 0‬כלומר המסלול הקצר ביותר מ־‪ s‬ל־‪ v‬הוא ‪u → v‬‬
‫כך שמתקיים )‪) δf 0 (s, u) + 1 = δf 0 (s, v‬תת־מסלול של מק”ב הוא מק”ב(‪.‬‬

‫∈ )‪) (u, v‬כאשר )‪ (u, v‬היא הקשת האחרונה במסלול ל־‪ v‬שהגדרנו בהוכחה למעלה(‪.‬‬
‫טענה ‪) 11.26‬טענת עזר( נראה כי ‪/ Ef‬‬
‫הוכחה‪) :‬של טענת העזר( נניח בשלילה ש־ ‪ .(u, v) ∈ Ef‬אזי מתקיים ‪) δf (s, v) ≤ δf (s, u) + 1‬מאי־שיוויון המשולש(‪ .‬נשים לב שלא‬
‫ייתכן כי )‪ ,δf 0 (s, u) < δf (s, u‬כיוון שאם זה היה מתקיים‪ ,‬אז ‪ u‬היה צומת שיותר קרוב ל־‪ s‬מאשר ‪ ,v‬אשר מקיים את התנאי כי‬
‫)‪ ,δf 0 (s, v) < δf (s, v‬והרי בחרנו את ‪ v‬כך שהוא הצומת המינימלי שמקיים זאת‪ .‬לכן‪ .δf 0 (s, u) ≥ δf (s, u) ,‬סך הכל נקבל‪:‬‬

‫)‪δf (s, v) ≤ δf (s, u) + 1 ≤ δf 0 (s, u) + 1 = δf 0 (s, v‬‬

‫בסתירה לכך ש־)‪.δf 0 (s, v) < δf (s, v‬‬


‫)המשך ההוכחה של הלמה‪(...‬‬
‫∈ )‪ ,(u, v‬ומכך ש־‪ u‬צומת במק”ב ל־‪ v‬נובע כי ‪ .(u, v) ∈ Ef 0‬כלומר‪ ,‬לאחר הוספת ההזרמה‬
‫מטענת העזר שהוכחנו נובע ש־ ‪/ Ef‬‬
‫התווספה הקשת )‪ (u, v‬לרשת השיורית‪ .‬הדבר ייתכן רק במצב שבו היתה הזרמה דרך הקשת ‪) (v, u) ∈ Ef‬בכיוון מ־‪ v‬ל־‪ .(u‬ההסבר‬
‫לכך הוא שיש שני מצבים בהם קשת מופיעה ברשת השיורית‪:‬‬
‫‪ .1‬כאשר יש עוד קיבולת שניתן להזרים בה )כלומר כאשר אנחנו לא מנצלים את המקסימום שניתן להזרים דרך הקשת(‪.‬‬
‫‪ .2‬כאשר יש הזרמה בכיוון ההפוך שניתן ”לבטל”‪.‬‬
‫נחלק למקרים‪:‬‬
‫• אם לא שינינו את הזרימה ב־)‪ ,(u, v‬אז היה מתקיים ‪ ,(u, v) ∈ Ef ⇐⇒ (u, v) ∈ Ef 0‬וזה לא המצב‪.‬‬
‫• אם הוספנו זרימה בכיוון ‪ ,u → v‬אז רק הקטנו את הכמות שניתן להזרים עוד ב־)‪) (u, v‬כלומר מדובר במקרה ‪ ,(1‬כך שאם‬
‫‪ (u, v) ∈ Ef 0‬אז בהכרח הקשת הופיעה ברשת השיורית לפני הוספת הזרימה )כלומר צריך להתקיים ‪ ,((u, v) ∈ Ef‬וזה גם לא‬
‫המצב‪.‬‬
‫∈ )‪ ,(u, v‬ולאחר ההזרמה בקשת‬
‫• אם הוספנו זרימה בכיוון ‪ ,v → u‬אז ייתכן שלפני ההוספה התקיים ‪ ,cf (u, v) = 0‬ואז ‪/ Ef‬‬
‫בכיוון ההפוך נקבל ממקרה ‪ 2‬כי ‪ ,cf (u, v) > 0‬ואז ‪ ,(u, v) ∈ Ef 0‬כדרוש‪.‬‬
‫סך הכל קיבלנו כי בהכרח מתקיים שהמסלול המגדיל שהעביר מהזרמה ‪ f‬ל־ ‪ f 0‬כלל את הקשת )‪) (v, u‬בכיוון מ־‪ v‬ל־‪ .(u‬כלומר‪,‬‬
‫‪ .p = s‬כיוון ש־‪ p‬מק”ב )כי באלגוריתם אדמונדס־קארפ תמיד נבחר מק”ב(‪,‬‬ ‫‪v→u‬‬ ‫המסלול המגדיל‪ ,‬נסמנו ‪ ,p‬היה מהצורה ‪t‬‬
‫הרי ש־)‪ ,δf (s, v) + 1 = δf (s, u‬ונקבל‪:‬‬

‫‪δf (s, v) + 1 = δf (s, u) ≤ δf 0 (s, u) = δf 0 (s, v) − 1‬‬

‫כלומר קיבלנו כי ‪ ,δf (s, v) ≤ δf 0 (s, v) − 2‬ובפרט )‪ ,δf (s, v) < δf 0 (s, v‬בסתירה להנחה הראשונית כי )‪ .δf (s, v) > δf 0 (s, v‬לכן‬
‫הנחת השלילה שגויה‪ ,‬והלמה מתקיימת‪.‬‬

‫הגדרה ‪ 11.27‬קשת ‪ (u, v) ∈ Ef‬היא קריטית על מסלול מגדיל ‪ p ∈ Gf‬אם )‪.cf (p) = cf (u, v‬‬
‫‪10‬‬ ‫‪2‬‬ ‫‪8‬‬ ‫‪2‬‬
‫לדוגמה‪ ,‬במסלול ‪ ,s → u → v → w → t‬הקשתות )‪ (u, v‬ו־)‪ (w, t‬הן קשתות קריטיות‪ ,‬שכן ‪.cf (p) = cf (u, v) = cf (w, t) = 2‬‬

‫הערה ‪11.28‬‬
‫‪ .1‬בכל מסלול מגדיל יש לפחות קשת קריטית אחת )בעלת הקיבול השיורי ‪ cf‬המינימלי(‪.‬‬

‫‪55‬‬
‫‪ .2‬נשים לב כי עבור רשת זרימה )‪ ,G = (V, E‬ומסלול מגדיל ‪ p‬שמעביר מזרימה ‪ f‬לזרימה ‪ ,f 0‬אם ‪ (u, v) ∈ Ef‬קשת קריטית‬
‫∈ )‪ .(u, v‬כלומר‪ ,‬לאחר הזרמה במסלול ‪ ,p‬הקשתות הקריטיות במסלול ”נעלמות” מהרשת השיורית‪.‬‬‫ב־‪ ,p‬אז ‪/ Ef 0‬‬

‫פעמים בריצה של ‪.EK‬‬ ‫| ‪|V‬‬


‫‪2‬‬ ‫למה ‪ 11.29‬קשת יכולה להיות קריטית לכל היותר‬
‫‪ s‬בגרף ‪ ,Gf‬מתקיים ‪.δf (s, v) = δf (s, u) + 1‬‬ ‫‪u→v‬‬ ‫הוכחה‪ :‬תהי ‪ .(u, v) ∈ E‬בפעם הראשונה ש־)‪ (u, v‬קריטית במק”ב ‪t‬‬
‫לאחר ההזרמה במסלול זה‪ ,‬הקשת )‪ (u, v‬נעלמת מהרשת השיורית‪ .‬ראינו בהוכחה קודמת שהמצב היחיד שבו במעבר מזרימה ‪f 0‬‬
‫לזרימה ‪ ,f 00‬ייתכן שקשת חזרה להופיע ברשת השיורית )כלומר ‪/ Ef 0‬‬
‫∈ )‪ (u, v‬וגם ‪ ,((u, v) ∈ Ef 00‬הוא אם היתה הזרמה בכיוון ההפוך‬
‫‪ .v → u‬לכן‪ ,‬על מנת ש־)‪ (u, v‬תוכל להיות שוב קריטית‪ ,‬הקשת ההפוכה‪ ,(v, u) ,‬חייבת להופיע במסלול מגדיל‪ .‬לכן ניתן לתאר את‬
‫התהליך בין פעם אחת שבה )‪ (u, v‬קריטית לפעם הבאה כך‪:‬‬
‫‪ (u, v) .1‬קריטית ב־ ‪) Gf‬ואז נעלמת(‬
‫‪ (v, u) .2‬מופיעה במסלול מגדיל ב־ ‪Gf 0‬‬

‫‪ (u, v) .3‬קריטית ב־ ‪Gf 00‬‬


‫)כך שזרימה ‪ f 0‬מופיעה לאחר מספר כלשהו של איטרציות אחרי ‪ ,f‬ו־ ‪ f 00‬מספר כלשהו של איטרציות אחרי ‪.(f 0‬‬
‫מכך ש־)‪ (u, v‬הופיעה במק”ב ב־‪ ,(∗) 1‬ו־)‪ (v, u‬הופיעה במק”ב ב־‪ ,(∗∗) 2‬והצמתים מקיימים את התנאי לפיו המרחק מ־‪ s‬רק‬
‫גדל )כלומר )‪ ,(∗ ∗ ∗) (δf (s, v) ≤ δf 0 (s, v‬הרי שנקבל‪:‬‬

‫)∗∗(‬ ‫)∗∗∗(‬ ‫)∗(‬


‫‪δf 0 (s, u) = δf 0 (s, v) + 1 ≥ δf (s, v) + 1 = δf (s, u) + 2‬‬

‫לכן מהרגע שבו )‪ (u, v‬קריטית ועד שהיא הופכת להיות שוב קריטית‪ ,‬מרחקו של ‪ u‬מ־‪ s‬גדל לפחות ב־‪ .2‬כעת כיוון שהמסלול הארוך‬
‫ביותר מ־‪ s‬ל־‪ u‬הוא באורך | ‪) |V‬כי זה מק”ב(‪ ,‬נקבל כי מספר הפעמים שקשת יכולה להיות קריטית הוא | ‪ , |V2‬כדרוש‪.‬‬

‫משפט ‪ 11.30‬כשמריצים ‪) EK‬אדמונדס־קארפ( על רשת זרימה )‪ ,G = (V, E‬מקור ‪ s‬ובור ‪ ,t‬אז מספר הוספות הזרימה הוא‬
‫)|‪.O(|V ||E‬‬

‫הוכחה‪ :‬מהלמה‪ ,‬כל קשת יכולה להיות קריטית | ‪ |V2‬פעמים לכל היותר‪ .‬לכן סך הכל‪ ,‬מספר הוספות הזרימה חסום ב־ | ‪.|E| × |V2‬‬
‫הסיבה לכך היא שבכל הוספת מסלול מגדיל לזרימה‪ ,‬לפחות קשת אחת הופכת מקריטית ללא־קריטית‪ ,‬שכן במסלול מגדיל תמיד יש‬
‫קשת קריטית‪ ,‬ולאחר ההוספה של המסלול הקשתות הקריטיות ”נעלמות”‪ .‬לכן קיבלנו כי מספר הוספות הזרימה הוא )|‪,O(|V ||E‬‬
‫כדרוש‪.‬‬

‫לסיכום‪:‬‬
‫האלגוריתם מבצע )|‪ O(|V ||E‬הוספות זרימה‪ ,‬כאשר הסיבוכיות למציאת מסלול מגדיל כנ”ל תהיה )|‪) O(|V | + |E‬שכן זו הסיבוכיות‬
‫של ‪ .(BFS‬לכן סך הכל הסיבוכיות תהיה )| ‪) O(|E|2 |V‬מתוך הנחה שלכל צומת יש לפחות קשת אחת‪ ,‬כך ש־|‪.(|V | ≤ |E‬‬

‫האלגוריתם של דיניץ )‪(Dinic‬‬ ‫‪11.4‬‬


‫הקדמה‬ ‫‪11.4.1‬‬
‫יש הבחנה שעלינו לעשות בנוגע לאלגוריתמים מהמשפחה של פורד־פולקרסון ־ בעוד שהאלגוריתם מתייחס להוספת זרימה לאורך‬
‫מסלול מגדיל כלשהו‪ ,‬למעשה נוכל לחשוב על הבעיה בתור הוספה של זרימה ‪ g‬כלשהי לזרימה ‪ f‬הנוכחית לקבלת זרימה ‪ .f 0‬נבחין‬
‫כי קיים ‪ trade-o‬בין הרצון שלנו למצוא את הזרימה שאנחנו רוצים להוסיף בקלות מירבית )בכמה שפחות עבודה(‪ ,‬לבין הרצון שלנו‬
‫לבצע מספר מועט ככל הניתן של איטרציות של הוספות זרימה‪ ,‬על מנת שהסיבוכיות הכוללת תהיה מינימלית‪.‬‬
‫באלגוריתם של ‪ Dinic‬נפעל על מנת לבצע פחות איטרציות של הוספות זרימה‪ ,‬כך שכל הוספה תדרוש מאיתנו יותר עבודה‪ ,‬אבל‬
‫בסך הכל הסיבוכיות שתתקבל תהיה קטנה מזו של אלגוריתם אדמונדס־קארפ‪.‬‬
‫הבחנה חשובה נוספת היא שהשימוש במק”בים הוא אפקטיבי‪ ,‬כפי שראינו ב־‪.EK‬‬

‫הגדרה ‪ 11.31‬זרימה ‪ g‬ב־‪ G‬נקראת חוסמת )‪ (blocking‬אם בכל מסלול מ־‪ s‬ל־‪ t‬יש קשת כך שהקיבול שלה שווה לזרימה ב־‪ g‬עליה‬
‫)כלומר קשת קריטית(‪.‬‬

‫הגדרה ‪ 11.32‬עבור רשת זרימה ‪ G‬מ־‪ s‬ל־‪ ,t‬נסמן ב־)‪ L(G‬את הרשת שמכילה רק קשתות שנמצאות על מק”ב כלשהו מ־‪.s‬‬

‫הערה ‪ 11.33‬אפשר לחשב את )‪ L(G‬ע”י הרצת ‪ BFS‬מ־‪ s‬ולקיחת קשתות )‪ (u, v‬עבורן מתקיים )‪) δ(s, u) + 1 = δ(s, v‬קשתות‬
‫שמחברות צמתים ברמות עוקבות בעץ ה־‪.(BFS‬‬

‫‪56‬‬
‫תיאור אבסטרקטי של האלגוריתם‬ ‫‪11.4.2‬‬
‫מאתחלים את רשת הזרימה לזרימה ‪ 0‬בכל הקשתות‪ .‬לאחר מכן באופן איטרטיבי‪ ,‬כל עוד ‪ t‬נגיש מ־‪ s‬ברשת השיורית ‪:Gf‬‬

‫• בונים את ) ‪L(Gf‬‬
‫• מוצאים זרימה חוסמת ‪ g‬מ־‪ s‬ל־‪ t‬ב־) ‪L(Gf‬‬
‫• מעדכנים את הזרימה ע”י הוספת ‪(f 0 = f + g) g‬‬
‫לכל איטרציה כזו באלגוריתם דיניץ קוראים פאזה‪ .‬לבסוף‪ ,‬מחזירים את ∗ ‪ f‬שהתקבלה‪.‬‬

‫איך מחשבים זרימה חוסמת? )בגרף חסר מעגלים(‬


‫נשתמש בוריאציה על ‪ DFS‬מ־‪:s‬‬
‫בכל שלב מחזיקים )במחסנית( מסלול מ־‪ s‬לצומת ‪.u‬‬
‫‪.(u = s) s‬‬ ‫מאתחלים מסלול ריק ‪s‬‬ ‫]‪[init‬‬
‫‪ .s‬נוסיף אותו לזרימה החוסמת שאנו בונים עם הקיבול השיורי שלו‪ ,‬ונעדכן‬ ‫]‪ [breakthrough‬אם ‪ u = t‬אז מצאנו מסלול ‪t‬‬
‫את הקיבולים לאורכו בהתאמה‪ .‬כעת לפחות קשת אחת שהיתה קריטית תשאר ללא קיבול שיורי‪ ,‬ונמחק אותה מהגרף‬
‫)בדומה לאלגוריתם ‪ ,EK‬היא ”נעלמת”(‪ .‬חשוב לשים לב שאנחנו לא מוסיפים את הקשתות ההפוכות בשלב זה )כלומר‬
‫אנחנו לא בונים מחדש את הרשת השיורית(‪ ,‬אלא אנחנו ממצים את הרשת הקיימת עד כמה שניתן‪ .‬כעת נחזור ל־]‪.[init‬‬
‫]‪ [advance‬אם יש קשת יוצאת מ־‪ ,u‬נבחר אחת כזו )‪ (u, v‬ונאריך את המסלול‪ .‬כלומר התקדמנו במסלול אל ‪ t‬בצעד אחד )בהכרח‬
‫התקדמנו‪ ,‬כי הגרף חסר מעגלים(‪.‬‬

‫אם אין קשת יוצאת מ־‪ u‬אז נמחק את ‪ u‬מהמסלול‪ ,‬וגם את הקשת בין ‪ u‬לבין קודמו במסלול מהגרף‪.‬‬ ‫]‪[retreat‬‬
‫לאחר ‪ init‬ננסה בכל פעם לעשות ‪ ,advance‬אם נגיע ל־‪ breakthrough‬מצויין‪ ,‬ואחרת אם נגיע ל־‪ dead end‬נבצע ‪ .retreat‬הריצה‬
‫תסתיים כאשר ננסה לעשות ‪ retreat‬מ־‪.s‬‬

‫הוכחת נכונות‬ ‫‪11.4.3‬‬


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

‫למה מובטח לנו שהאלגוריתם בכל פאזה יחזיר זרימה חוסמת?‬


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

‫ניתוח סיבוכיות‬ ‫‪11.4.4‬‬


‫• ]‪ :[init‬לוקח )‪ ,O(1‬ועושים אותו מספר פעמים כמספר ה־‪ ,[breakthrough] + 1‬כך שזה יבלע בסיבוכיות של ה־ ‪BT‬‬
‫)‪.(breakthrough‬‬

‫• ]‪ :[breakthrough‬אם מצאנו ‪ k‬מסלולים והמרחק ‪ δ(s, t) = l‬אז העבודה המושקעת לכל ‪ BT‬היא )‪.O(l‬‬
‫– עבור עדכוני הקיבולים‪ ,‬מחיקת המסלול וכו'‪ ,‬סה”כ )‪.O(kl‬‬
‫– כיוון ש־| ‪) l ≤ |V‬כי המסלולים הם מק”בים( ו־|‪) k ≤ |E‬כי כל ‪ BT‬מוחק קשת אחת לפחות שהיתה קריטית(‪ ,‬אז‬
‫)|‪.kl = O(|V ||E‬‬

‫• ]‪ :[retreat‬כולם יחד לא יותר מ־|‪) |E‬כי בכל פעם שנסוגים‪ ,‬מוחקים קשת מהגרף(‪.‬‬
‫• ]‪ :[advance‬הבעיה כביכול עם ‪ advance‬היא שניתן להתקדם בקשת מסוימת יותר מפעם אחת‪ .‬עם זאת‪ ,‬נשים לב שעל מנת‬
‫להגיע למצב שאנחנו מתקדמים בקשת פעם נוספת היינו צריכים לחזור אחורה ע”י ‪ BT‬או ע”י ‪ ,retreat‬לכן סך הכל כמות‬
‫העבודה של ‪ advance‬חסומה ע”י כמות העבודה של ‪.BT + retreat‬‬

‫סך הכל קיבלנו כי הסיבוכיות של פאזה היא )|‪) O(|E| + kl) = O(|E| + |V ||E|) = O(|V ||E‬יש לציין שבניית הגרפים תעשה בזמן‬
‫לינארי‪ ,‬לכן זה נבלע בסיבוכיות הכוללת(‪.‬‬

‫הערה ‪ 11.34‬יש מבנה נתונים שנקרא ‪ dynamic trees‬שמשפר את זמן הריצה של פאזה בודדת‪.‬‬

‫‪57‬‬
‫טענה ‪ 11.35‬מתקיים ש־)‪ δGi+1 (s, t) > δGi (s, t‬כאשר ‪ fi , fi+1‬זרימות בפאזות עוקבות ‪ i, i + 1‬בהתאמה‪ ,‬ו־ ‪ Gi , Gi+1‬הרשתות‬
‫השיוריות המתאימות‪.‬‬
‫‪ s‬מאורך ≥ ‪) l‬אמנם דיניץ בכלל עובד על הגרף ) ‪ ,L(Gi‬אבל‬ ‫הוכחה‪ :‬נסמן )‪ .l := δGi (s, t‬רוצים להראות שאין ב־ ‪ Gi+1‬מסלול ‪t‬‬
‫כיוון שזהו גרף מק”בים ברור שאורך המסלול המינימלי ב־ ‪ Gi‬וב־) ‪ L(Gi‬שווה(‪ .‬כיוון שזרימה ‪ g‬שחישבנו בפאזה חוסמת עבור ) ‪L(Gi‬‬
‫‪ s‬עליו ‪ g‬לא ”מרווה” קשת )כלומר‪ ,‬מזרימה כמות מקסימלית בקשת קריטית(‪.‬‬ ‫אז לא קיים ב־) ‪) L(Gi‬וגם לא ב־ ‪ (Gi‬מסלול ‪t‬‬
‫‪ s‬ב־ ‪ Gi+1‬צריך להשתמש בקשתות ”חדשות” )שלא היו ב־) ‪ ,(L(Gi‬שהן הפוכות לקשתות מ־ ‪ Gi‬או ששייכות למסלול‬ ‫לכן מסלול ‪t‬‬
‫ארוך יותר‪ ,‬מאורך ‪ l + 1‬לפחות )לכן הוא לא הופיע בגרף המק”בים(‪ .‬נבחין כי גם במקרה שבו המסלול כולל קשתות הפוכות‪ ,‬אורכו‬
‫יגדל לפחות ב־‪) 1‬ייתכן שנשאר באותה רמה‪ ,‬או שממש נחזור אחורה‪ ,‬ורק אז נתקדם‪ ,‬אבל בכל מקרה המסלול יהיה ארוך יותר(‪ .‬סך‬
‫‪ s‬ב־ ‪ Gi+1‬יהיה באורך גדול ממש מ־‪.l‬‬ ‫הכל קיבלנו כי כל מסלול ‪t‬‬

‫מסקנה ‪ 11.36‬מספר הפאזות חסום ע”י ‪ ,|V | − 1‬כי בהתחלה המרחק ≤ ‪ ,1‬ומרחק מקסימלי )כל עוד יש מסלול מ־‪ s‬ל־‪ (t‬יהיה‬
‫≥ ‪.|V | − 1‬‬

‫לסיכום‪:‬‬
‫קיבלנו כי הסיבוכיות של פאזה היא )|‪ ,O(|V ||E‬וכן מספר הפאזות הוא )| ‪ ,O(|V‬לכן קיבלנו כי הסיבוכיות הכוללת של האלגוריתם‬
‫היא )|‪.O(|V |2 |E‬‬

‫רשתות מיוחדות‪:‬‬
‫ישנן רשתות מיוחדות בהן הסיבוכיות של דיניץ קטנה מ־)|‪:O(|V |2 |E‬‬
‫• בהרבה שימושים הקיבולים כולם ‪ .1‬רשתות כאלה נקראות לעיתים רשתות ‪ 0/1‬או ”מטיפוס ‪.”I‬‬
‫– הבחנה ‪ :1‬במהלך ‪ BT‬כל הקשתות על המסלול הן קריטיות )כי הקיבולים שווים(‪ ,‬לא רק אחת‪ ,‬לכן כולן ימחקו‪ .‬זה‬
‫|‪ ,k ≤ |E‬כי כל ‪ BT‬מוחק ‪ l‬קשתות‪ .‬מכאן נובע שזמן הריצה של פאזה‬ ‫מגביל את מספר ה־ ‪) BT‬שסימנו ב־‪ (k‬כך ש־ ‪l‬‬
‫הוא )|‪ ,O(|E| + kl) = O(|E‬וזמן הריצה הכולל הוא )|‪.O(|V ||E‬‬
‫– הבחנה ‪ :2‬כמות הפאזות נמוכה יותר‪.‬‬
‫‪p‬‬
‫טענה ‪ 11.37‬ברשת ‪ 0/1‬דיניץ מבצע לכל היותר |‪ 2 |E‬פאזות‪.‬‬
‫הוכחה‪ :‬נתבונן בזרימה ‪ fx‬אחרי פאזה ‪ .x‬המרחק )‪ δGx (s, t‬הוא לכל הפחות ‪) x‬ביצענו ‪ x‬פאזות‪ ,‬וכל אחת מגדילה את‬
‫המרחק לפחות ב־‪ .(1‬נסמן ב־ ∗ ‪ f‬את הזרימה המקסימלית ברשת המקורית‪ .‬אם כן‪ ,‬הרי שהזרימה ‪ f ∗ − fx‬היא הזרימה‬
‫המקסימלית ב־ ‪ .Gfx‬נפרק אותה ל־‪ k‬מסלולים כאשר | ‪ ,k = |f ∗ − fx‬והמסלולים האלו זרים בקשתות )כי לכל קשת‬
‫קיבול של ‪ ,1‬וכל מסלול ”מרווה” את כל הקשתות שלו(‪.‬‬
‫|‪) k ≤ |E‬יש ‪ k‬מסלולים זרים בקשתות‪ ,‬וכל אחד באורך של לפחות ‪ .(x‬כיוון שכל פאזה מעלה ב־‪ 1‬לפחות את ערך‬ ‫לכן ‪x‬‬
‫הזרימה‪ ,‬אז תוך לכל היותר | ‪ k = |f ∗ − fx‬פאזות האלגוריתם יעצור‪.‬‬
‫|‪ x) x + |E‬הפאזות הראשונות עד זרימה ‪ ,fx‬ועוד לכל היותר ‪ k‬הפאזות הבאות(‪.‬‬ ‫‪ p‬הכולל הוא ‪x‬‬ ‫קיבלנו כי מספר הפאזות‬
‫|‪.x + |E‬‬ ‫|‪|E‬‬
‫‪p‬‬ ‫‪p‬‬
‫‪x‬‬ ‫=‬ ‫|‪|E‬‬ ‫‪+‬‬ ‫√‬ ‫=‬ ‫‪2‬‬ ‫|‪|E‬‬ ‫החסם‬ ‫את‬ ‫ונקבל‬ ‫‪,x‬‬ ‫=‬ ‫עכשיו נוכל לבחור |‪|E‬‬
‫|‪|E‬‬

‫‪3‬‬
‫זה מוריד את זמן הריצה על רשת ‪ 0/1‬ל־) ‪.O(|E| 2‬‬

‫• נאמר שרשת ‪ 0/1‬היא פשוטה או ”מטיפוס ‪ ”II‬אם לכל צומת דרגת הכניסה ≥ ‪ 1‬או דרגת היציאה ≥ ‪) 1‬למשל הרשת לחישוב‬
‫זיווג מקסימלי בגרף דו”צ שנראה בהמשך(‪.‬‬
‫‪p‬‬
‫טענה ‪ 11.38‬ברשת ‪ 0/1‬פשוטה מספר הפאזות חסום ע”י | ‪.2 |V‬‬
‫הוכחה‪ :‬אחרי ‪ x‬פאזות‪ ,‬התקבלה הזרימה ‪ .fx‬עד לזרימת מקסימום ∗ ‪ f‬נותרו לכל היותר | ‪ k = |f ∗ − fx‬פאזות‪ .‬כעת ‪f ∗ − fx‬‬
‫מתפרקת למסלולים זרים בצמתים פנימיים בגלל התנאי )לכל צומת אנחנו יכולים ”לבזבז” את דרגת הכניסה‪/‬יציאה פעם אחת‬
‫בלבד(‪.‬‬
‫| ‪|V‬‬ ‫‪|V |−2‬‬ ‫| ‪|V‬‬
‫‪p‬‬ ‫∗‬
‫לכן ‪ ,k ≤ |f − fx | ≤ x−1 ≈ x‬כך שכמות הפאזות תהיה ‪ ,x + x‬ועבור | ‪ x = |V‬נקבל את החסם‪.‬‬

‫‪p‬‬
‫מסקנה ‪ 11.39‬ברשת ‪ 0/1‬פשוטה דיניץ לוקח )| ‪.O(|E| |V‬‬
‫‪2‬‬
‫טענה ‪ 11.40‬ברשת ‪ ,0/1‬לאו דווקא פשוטה‪ ,‬בלי קשתות מקבילות‪ ,‬מספר הפאזות חסום ע”י ‪.2|V | 3‬‬

‫מסקנה ‪ 11.41‬ברשת כזו זמן הריצה של ‪ Dinic‬הוא )} ‪ .O(min{|E| 2 , |E||V | 3‬כמובן שאם הרשת היא פשוטה החסם )| ‪O(|E| |V‬‬
‫‪p‬‬ ‫‪3‬‬ ‫‪2‬‬

‫הוא הטוב ביותר‪.‬‬

‫‪58‬‬
‫צימוד )זיווג( בגרפים לא מכוונים )‪(Maximum Matching in Bipartite Graphs‬‬ ‫‪12‬‬
‫־ המשך פרק ‪ 26‬בספר‬
‫הגדרה ‪ 12.1‬בהנתן גרף לא מכוון )‪ ,G = (V, E‬זיווג )‪ (matching‬הוא תת־קבוצה של קשתות ‪ ,M ⊆ E‬כך שלכל ‪ v ∈ V‬יש לכל‬
‫היותר קשת אחת ‪ e ∈ M‬כך ש־‪ .v ∈ e‬צומת ‪ v ∈ V‬נקרא מזווג )‪ (matched‬ע”י זיווג ‪ M‬אם קיימת קשת ב־ ‪ M‬הקשורה ל־‪.v‬‬

‫הגדרה ‪ 12.2‬זיווג מקסימלי )‪ (maximum matching‬הוא זיווג בעל עוצמה מקסימלית‪ ,‬כלומר זיווג ‪ M‬המקיים כי לכל זיווג אחר ‪M 0‬‬
‫מתקיים | ‪.|M 0 | ≤ |M‬‬

‫הגדרה ‪) 12.3‬זו הגדרה שלא קיימת בספר‪ ,‬אך היא הופיעה בהרצאה של פרופ' פיאט ובתרגול(‬
‫זיווג מקסימלי נקודתי )‪ (maximal matching‬הוא זיווג שלא ניתן להוסיף לו אף קשת כך שיתקבל זיווג חוקי‪ .‬יש להבחין בין‬
‫‪ maximum matching‬ל־‪ ,maximal matching‬שכן הראשון הוא המקסימלי על פני כל הזיווגים האפשריים בגרף מסויים‪ ,‬בעוד‬
‫שהשני מתייחס רק לזיווגים שניתן לקבל כתוצאה מהוספת קשתות לזיווג נתון‪ .‬לכן ייתכן שזיווג הוא מקסימלי נקודתי‪ ,‬אך איננו‬
‫מקסימום )ההפך כמובן לא נכון(‪.‬‬

‫‪:maximal‬‬ ‫דוגמה להבדל בין ‪ maximum matching‬ו־‪matching‬‬


‫עבור הגרף ‪ ,a − b − c − d‬הזיווג })‪ Mmaximal = {(b, c‬הוא מקסימלי נקודתי )הוספת כל אחת מהקשתות )‪ (a, b), (c, d‬ל־ ‪M‬‬
‫לא תהיה חוקית(‪ .‬לעומת זאת‪ ,‬ברור שזיווג המקסימום הוא })‪ .Mmaximum = {(a, b), (c, d‬אכן קיבלנו כי בדוגמה זו מתקיים‬
‫| ‪.|Mmaximal | = 1 < 2 = |Mmaximum‬‬

‫‪59‬‬

You might also like