מבני נתונים ואלגוריתמים - מחברת קורס/גרפים/זרימה - הגדרות
מתוך ויקיספר, אוסף ספרי הלימוד והמדריכים החופשי.
דף זו הוא הראשון משלשה העוסק באלגוריתמים למציאת זרימת המקסימום בגרף מכוון המתאר "רשת צינורות".
|
כדאי לדעת: נחלק את החומר שנלמד בזרימה לשלשה חלקים:
|
|
כדאי לדעת: בספר הקורס, הפרק "Maximum Flow" (תתי פרקים 1 ו2) מכסה נושא זה. |
|
מימוש C++ |
תוכן עניינים |
[עריכה] הבעיה
נתונים גרף מכוון
, טבלת קיבולים לקשתות
, צומת מקור
כלשהו, וצומת בור
כלשהו. בהינתן צומת
כלשהו, רוצים לדעת מה זרימת המקסימום מ
ל
.
|
דוגמה: בגרף שבתרשים הבא, המספר המצויין על כל קשת הוא קיבולו:
התרשים הבא מראה את זרימת המקסימום: המספר בסוגריים בכל קשת מציין כמה ליטר לשניה מזרימים בה. כך, לדוגמה, בקשת סך הזרימה היא |
[עריכה] הגדרות מדוייקות לבעיה
[עריכה] רשת זרימה
|
הגדרה: רשת זרימה היא:
|
|
דוגמה: ברשת הזרימה הראשונה שראינו (התרשים הראשון שבדף זה):
|
[עריכה] זרימה חוקית
|
הגדרה: ברשת זרימה, זרימה חוקית היא קביעת ערך
|
|
כדאי לדעת: סטודנטים להנדסה יזהו דמיון בין שני החוקים האחרונים לחוקי קירקהוף. |
|
דוגמה: ברשת הזרימה הראשונה שראינו (התרשים הראשון שבדף זה):
|
|
דוגמה: ברשת הזרימה הראשונה שראינו (התרשים הראשון שבדף זה), הזרימה בתרשים הבא אינה חוקית. בין היתר:
|
[עריכה] גודל הזרימה
|
הגדרה: ברשת זרימה, נניח שמצאנו זרימה חוקית |
|
דוגמה: בזרימה הראשונה שראינו (התרשים השני שבדף זה), גודל הזרימה הוא |
|
כדאי לדעת: אפשר לחשוב על הגדרות אחרות לגודל הזרימה, כמו סכום הזרימות שנכנסות ל |
[עריכה] קלט ופלט
לאחר שראינו את ההגדרות המדוייקות לבעיה, ברור מה אנו מנסים לפתור מבחינה מתמטית. עם זאת, בקורס זה אנו לרוב עוסקים באלגוריתמים בעלי קלט ופלט מוגדרים על ידי טיפוסים בפסוודו-קוד. נעסוק בכך כעת.
[עריכה] הקלט
נניח שקיבולי הקשתות נתונות ע"י טבלת עלויות. באופן דומה למה שראינו במסלולים זולים לכלל הזוגות, לא נניח שמדובר בטבלת ערבול, אלא נניח שCapacities היא מטריצה שלה כניסה Capacities[u][v] לכל שני צמתים (כלומר, אף פעם לא מוחזר הערך Nil, כבטבלת ערבול). הערך Capacities[u][v], הנו:
- קיבול הקשת מ
uלv, אם יש קשת כזו.
אם אין קשת כזו.
לשם הנוחות, בשאר החומר בנושא נגדיר
Capacities[u][v].
|
דוגמה: בגרף הקודם שראינו: |
|
שימו לב:
|
[עריכה] הפלט
נרצה פלט שמתאר כמה זורם בכל קשת. באופן כללי יש יש יותר מדרך אחת הגיונית לעשות זאת; אנו נבחר בדרך שייתכן שתיראה שרירותית בתחילה. נניח שהפלט הוא Flows, שהיא מטריצה שלה כניסה Flows[u][v] לכל שני צמתים (כלומר, אף פעם לא מוחזר הערך Nil, כבטבלת ערבול). הערך Flows[u][v] מתאר כמה זורם מ
ל
, שהוא, עפ"י ההגדרה, מינוס מה שזורם מ
ל
. לשם הנוחות, בשאר החומר בנושא נגדיר
Flows[u][v].
|
דוגמה: בגרף הקודם שראינו: |
|
שימו לב:
|
| הפרק הקודם: אלגוריתם Floyd-Warshall |
זרימה - הגדרות תרגילים |
הפרק הבא: זרימה שיורית וחתכים |
קיבול
. לכן
קיבול
. לכן
יכולה להזרים
. לכן
, וצומת בור
.
מזרימים 
, כי בכל יחידת זמן מזרימים
. אפשר לבדוק שאין אפשרות לעשות יותר מכך.
; לכל שני צמתים
, יש קיבול 









.
לכל שני צמתים
.
.
.
, וכו', היא אכן זרימה חוקית.
, עבור כל שני צמתים 
, דבר שסותר את מגבלת הקיבול.
, דבר שסותר את שימור הזרם.
(המתאימה מספר לכל זוג צמתים
. במילים אחרות, גודל הזרימה הוא סכום הזרימות שיוצאות מ
.

מתאר כמה אפשר להזרים מ
.



.