גרף קשיר

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש
גרף לא קשיר: אין מסלול המקשר את הקודקודים A ו-B. לגרף יש שני מרכיבי קשירות. הערה: יש לשים לב שב"הצטלבות" במרכז הגרף אין קודקוד, כך שלמעשה אין זו הצטלבות, אין קשר בין הצלעות בה.

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

פורמלית, גרף G=\left(V,E\right) ייקרא קשיר אם לכל זוג צמתים V_i\, ו-V_j\, ב-V\, קיימת סדרה של קשתות e_1, e_2, \ldots, e_k ב-E\, כך שאם e_\ell = (v_{a_\ell}, v_{b_\ell}) לכל \ell אז:

א. a_1\,= i. דהיינו, המסלול מתחיל בצומת v_i\,.

ב. b_k\,= j. דהיינו, המסלול מסתיים בצומת v_j\,.

ג. לכל \ell מתקיים b_\ell = a_{\ell+1}. דהיינו, סדרת הקשתות מהווה מסלול בגרף.

גרף שאינו קשיר היטב: אין מסלול מכוון מ- B ל- A. אם מבטלים את הכיווניות של הגרף, הוא הופך להיות קשיר

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

במתמטיקה באופן כללי, ובעיקר בטופולוגיה, קשירות של קבוצה מציינת שכל הקבוצה היא "בחתיכה אחת". בתורת הגרפים קשירות מתבטאת בכך שכל צומתי הגרף מחוברים יחד, במובן זה שניתן להגיע מכל צומת לכל צומת אחר. קשירות היא דרישה בסיסית מגרפים, על מנת שיקיימו תכונות נוספות. למשל, כדי שיהיה בגרף מסלול אוילרי, הכרחי שהוא יהיה קשיר (עד כדי צמתים שאינם מחוברים כלל לקשתות). קשירות היא גם דרישה בסיסית מעץ.

רכיבי קשירות[עריכת קוד מקור | עריכה]

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

רכיב קשיר היטב[עריכת קוד מקור | עריכה]

גרף שבו מסומנים הרכיבים הקשירים היטב

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

אלגוריתמים רבים בתורת הגרפים מניחים שהגרף עליו הם פועלים קשיר היטב, ועל כן מפעילים אותם על כל רכיב קשיר היטב בנפרד.

גרף מכוון בו עבור כל שני קדקודים u,v \in V קיים מסלול מ-u ל-v או מ-v ל-u נקרא קשיר למחצה.

גרף מכוון הנעשה קשיר לאחר הסרת הכיווניות נקרא קשיר חלש.

אלגוריתם למציאת רכיבים קשירים היטב[עריכת קוד מקור | עריכה]

קיים אלגוריתם פשוט יחסית למציאת הרכיבים הקשירים היטב בגרף שזמן ריצתו לינארי בגודל הגרף. האלגוריתם מתבסס על שימוש כפול באלגוריתם חיפוש לעומק - פעם אחת על הגרף \ G עצמו, ופעם על הגרף ה"משוחלף" \ G^T המתקבל מהיפוך כל כיווני הקשתות.

תיאור האלגוריתם:

  1. ראשית מפעילים את אלגוריתם חיפוש לעומק על \ G, ועבור כל צומת זוכרים את זמן היציאה ממנו.
  2. כעת מחשבים את \ G^T. הדבר ניתן לביצוע בזמן לינארי.
  3. כעת מפעילים את אלגוריתם חיפוש לעומק שנית, הפעם על \ G^T. מתחילים את ריצת האלגוריתם מהצומת בעל זמן היציאה הגבוה ביותר מבין אלו שחושבו בשלב 1, וכאשר האלגוריתם מסיים את הסריקה שהחלה מהצומת הזה ועליו לבחור צומת חדש, בוחרים את הצומת בעל זמן היציאה הגבוה ביותר מבין אלו שנשארו, וכן הלאה.
  4. תוצאת האלגוריתם שהופעל בשלב 3 היא יער. כל אחד מהעצים שביער הוא אחד מהרכיבים הקשירים היטב שבגרף, וכולם מופיעים בו. מוציאים אותם כפלט, בהתאם למבוקש (תוצאות החיפוש לעומק בלבד אינן מספיקות, שכן הוא בוצע על הגרף המשוחלף).

הסיבה לכך שמובטח שהאלגוריתם יעבוד כהלכה היא זו: אם \ C_1,C_2 הם שני רכיבים קשירים היטב בגרף כך שיש קשת מ-\ C_1 אל \ C_2, אז מובטח כי זמן היציאה שחושב בשלב 1 עבור צומתי \ C_1 גדול מזה שחושב עבור צומתי \ C_2 (לא קיימת קשת מ-\ C_2 אל \ C_1, שכן אז היו שני הרכיבים הללו מתמזגים לרכיב אחד).

על כן, בגרף המשוחלף \ G^T, לא קיימת קשת מ-\ C_1 אל \ C_2 (כי הקשתות הפכו את כיוונן). מכיוון שאלגוריתם החיפוש לעומק בשלב 3 מתחיל את ריצתו מהרכיב שמכיל את הצומת בעל זמן היציאה הגדול ביותר, ולכן מרכיב זה לא ניתן להגיע לרכיבים אחרים, והאלגוריתם יחשב אותו בלבד. לאחר שהאלגוריתם פעל על רכיב זה צמתיו מסומנים כך שהאלגוריתם לא ייכנס אליהם שוב, ולכן מובטח כי גם המשך פעולת האלגוריתם תחזיר את התוצאה הנכונה.

קשירות מרובה[עריכת קוד מקור | עריכה]

גרף נקרא k-קשיר (בקודקודים) אם הוא נותר קשיר לאחר הסרת פחות מ-k קודקודים, ו-k-קשיר-קשתות אם הוא נותר קשיר לאחר הסרת פחות מ-k-קשתות. גרף "1-קשיר-קשתות" אינו אלא גרף קשיר. משפט מנגר קובע כי גרף הוא k-קשיר אם ורק אם בין כל שני קודקודים בגרף קיימים k מסלולים זרים בקודקודים והוא k-קשיר-קשתות אם ורק אם בין כל שני קודקודים בגרף קיימים k מסלולים זרים בקשתות.