Class Hub
Graphs·Διάλεξη 8·~52 min

L08 · Γραφήματα ΙΙΙ — Εφαρμογές, Διμερότητα, Κατευθυνόμενα

Τι θα δούμε

Στο L07 χτίσαμε δύο εργαλεία — BFS και DFS — που διασχίζουν ένα γράφημα σε χρόνο . Εκεί ήταν τα εργαλεία. Εδώ είναι η δουλειά: θα δούμε πόσα διαφορετικά προβλήματα λύνονται, σχεδόν χωρίς κόπο, μόλις τα αναγνωρίσεις ως «μια διάσχιση μεταμφιεσμένη».

  1. Συνεκτικές συνιστώσες — βρες όλες τις ομάδες κορυφών, χωρίς να ξέρεις από πού να ξεκινήσεις.
  2. Flood fill — το «κουβαδάκι» του Paint.
  3. Έλεγχος διμερότητας — μπορώ να χωρίσω τις κορυφές σε δύο ομάδες ώστε κάθε ακμή να τις διασχίζει;
  4. Κατευθυνόμενα γραφήματα — όταν οι ακμές έχουν φορά.
  5. Ισχυρή συνεκτικότητα — φτάνουν όλοι σε όλους, σεβόμενοι τις φορές;
  6. Συντομότερη διαδρομή με βάρη — η προετοιμασία για το L09.

Εφαρμογή 1 · Συνεκτικές συνιστώσες

Πρόβλημα. Δεδομένου γραφήματος , βρες όλες τις συνεκτικές συνιστώσες — τις ομάδες κορυφών μέσα στις οποίες όλοι φτάνουν σε όλους, και που δεν μπορείς να τις μεγαλώσεις άλλο: αν προσθέσεις οποιαδήποτε άλλη κορυφή του γραφήματος, χαλάει το «όλοι φτάνουν σε όλους».

Ένα BFS από μια κορυφή βρίσκει τη συνιστώσα της — όλα όσα είναι προσπελάσιμα από εκείνη. Για να τις βρούμε όλες, η ιδέα είναι απλή: ξεκίνα ένα νέο BFS από κάθε κορυφή που δεν έχει ακόμα επισκεφθεί.

ΑλγόριθμοςΣυνεκτικές συνιστώσες
O(n + m)
Διάτρεξε τις κορυφές· κάθε φορά που βρίσκεις μία ανεπίσκεπτη, ένα BFS από εκεί ξεκλειδώνει ολόκληρη μια καινούργια συνιστώσα.
Είσοδος:
μη κατευθυνόμενο γράφημα G
Έξοδος:
η λίστα όλων των συνεκτικών συνιστωσών

Με λόγια. Κράτα όλες τις κορυφές αρχικά «μη επισκεφθείσες». Διάτρεξέ τις μία-μία· μόλις συναντήσεις μια κορυφή που είναι ακόμα ανεπίσκεπτη, ξέρεις ότι ανήκει σε μια συνιστώσα που δεν έχεις δει — οπότε τρέξε ένα BFS από εκεί, που μαρκάρει και επιστρέφει ολόκληρη τη συνιστώσα. Οι υπόλοιπες κορυφές αυτής της συνιστώσας θα είναι πια «επισκεφθείσες», οπότε το εξωτερικό loop θα τις προσπεράσει.

Δες την εξωτερική επανάληψη σε δράση. Παρατήρησε δύο πράγματα: κάθε φορά που η σάρωση πέφτει σε ανεπίσκεπτη κορυφή, ένα BFS φωτίζει ολόκληρη μια συνιστώσα μονομιάς· κάθε φορά που πέφτει σε ήδη επισκεμμένη, την προσπερνά χωρίς να κάνει τίποτα.

Όλες οι συνεκτικές συνιστώσες — η εξωτερική επανάληψη
Κορυφή 0/13

Κλήσεις BFS: 0 · κορυφές μαρκαρισμένες: 0/13

1
2
3
4
5
6
7
8
9
10
11
12
13
12345678910111213
Συνιστώσα 1 — BFS από την 1
Συνιστώσα 2 — BFS από την 9
Συνιστώσα 3 — BFS από την 11
Η εξωτερική επανάληψη θα διατρέξει τις κορυφές 1…13 με τη σειρά. Κάθε ανεπίσκεπτη κορυφή πυροδοτεί ένα BFS. Πάτα «Επόμενο».

Εφαρμογή 2 · Flood fill

Πρόβλημα. Σε μια εικόνα με πράσινα εικονοστοιχεία (pixels), δίνεται ένα πράσινο pixel — άλλαξε σε μπλε όλη τη συνεκτική περιοχή πράσινων pixels γύρω του.

Φαίνεται διαφορετικό πρόβλημα, αλλά είναι το ίδιο. Αρκεί να το μοντελοποιήσεις σωστά:

  • Κορυφές: τα pixels.
  • Ακμή : τα είναι γειτονικά (πάνω/κάτω/αριστερά/δεξιά) και τα δύο πράσινα.
  • Η περιοχή: η συνεκτική συνιστώσα του δοσμένου pixel.

Η λύση είναι, λοιπόν, ένα BFS (ή DFS) από το δοσμένο pixel — χρωμάτισε μπλε ό,τι επισκέπτεσαι. Χρόνος , με τα pixels και τα γειτονικά ζεύγη.

Γίνε εσύ το «κουβαδάκι». Κάνε κλικ σε ένα πράσινο pixel και δες το BFS να απλώνεται κύμα-κύμα — να στρίβει γύρω από τα γκρι pixels και να σταματά εκεί ακριβώς που τελειώνει η συνεκτική πράσινη περιοχή:

Flood fill — το «κουβαδάκι» είναι ένα BFS
Κύμα 0/17

Γεμισμένα: 0/56 pixels της περιοχής

Διάλεξε ένα πράσινο pixel — κάνε κλικ σε όποιο θες, ή πάτα ▶. Το flood fill είναι ένα BFS που ξεκινά από εκεί.

Εφαρμογή 3 · Έλεγχος διμερότητας

Αυτή είναι η πιο ουσιαστική εφαρμογή της διάλεξης — και η πιο πιθανή να πέσει στις εξετάσεις. Αξίζει να τη δούμε με την ησυχία μας.

Νιώσε: τι σημαίνει «διμερές»

Ένα γράφημα είναι διμερές (bipartite) αν μπορείς να χρωματίσεις τις κορυφές με δύο χρώματα — π.χ. κόκκινο και μπλε — ώστε κάθε ακμή να έχει διαφορετικό χρώμα στα δύο της άκρα.

Ισοδύναμα: μπορείς να χωρίσεις τις κορυφές σε δύο ομάδες και , έτσι ώστε κάθε ακμή να πηγαίνει από το στο — καμία ακμή να μη μένει μέσα στο ή μέσα στο .

Το εμπόδιο: περιττοί κύκλοι

Πότε σκάει ο 2-χρωματισμός; Πάντα στο ίδιο σημείο: σε έναν κύκλο περιττού μήκους. Η ιδέα είναι σχεδόν μηχανική: μόλις χρωματίσεις την πρώτη κορυφή κάποιου κύκλου, δεν έχεις πια άλλη επιλογή — κάθε επόμενη πρέπει να πάρει το αντίθετο χρώμα από την προηγούμενη, γιατί τις χωρίζει μια ακμή. Όταν τελικά γυρίσεις πίσω στην αφετηρία, ή το χρώμα ταιριάζει (η κλείνουσα ακμή έχει διαφορετικά χρώματα στα δύο της άκρα — όλα καλά) ή χτυπάει σε αντίφαση. Δοκίμασε κάθε μήκος κύκλου από 3 ως 8 και δες πότε ταιριάζει και πότε σπάει:

Άρτιο ή περιττό μήκος — δοκίμασε να χρωματίσεις τον κύκλο εναλλάξ
k = 5 · περιττό

Άρτιο index → κόκκινο, περιττό → μπλε. Πάτα «Επόμενο» και δες αν η κλείνουσα ακμή σπάει.

v0v1v2v3v4
Μήκος κύκλου k5
345678
Χρώμα ανά κορυφή
v0
v1
v2
v3
v4
Κύκλος μήκους k = 5. Θα δοκιμάσουμε εναλλάξ χρωματισμό: άρτιο index → κόκκινο, περιττό → μπλε. Η ΚΑΘΕ επόμενη κορυφή είναι αναγκασμένη να πάρει το αντίθετο χρώμα από την προηγούμενη — η ακμή ανάμεσά τους το απαιτεί.
Βήμα 0 / 6

Το μοτίβο είναι αναπόφευκτο: για άρτιο καταλήγεις στην τελευταία κορυφή με χρώμα διαφορετικό από την αφετηρία — η κλείνουσα ακμή είναι «κόκκινο ↔ μπλε», όλα ταιριάζουν. Για περιττό καταλήγεις στο ίδιο χρώμα με την αφετηρία — η κλείνουσα ακμή ενώνει δύο κορυφές ίδιου χρώματος, και κανένα ξεκίνημα δεν τη γλιτώνει (αν αρχίζαμε με μπλε, θα συναντιόμασταν σε μπλε). Άρα:

Το εντυπωσιακό είναι ότι ισχύει και το αντίστροφο — και η απόδειξή του δίνει κατευθείαν τον αλγόριθμο.

Το θεώρημα: τα επίπεδα του BFS αποφασίζουν

Δες το θεώρημα να δουλεύει. Το εργαλείο χρωματίζει τα επίπεδα ένα-ένα και μετά ελέγχει τις ακμές — δοκίμασε και τα δύο γραφήματα από τον διακόπτη:

Έλεγχος διμερότητας — χρωμάτισε τα επίπεδα του BFS
L0L1L2L3ABCDEFG
BFS από την κορυφή A. Θα χρωματίσουμε τα επίπεδα εναλλάξ: άρτια επίπεδα κόκκινα, περιττά μπλε. Πάτα «Επόμενο».
Βήμα 0 / 5

Η απόδειξη

Περίπτωση 1 — καμία ακμή μέσα σε επίπεδο. Θυμήσου την ιδιότητα του BFS: κάθε ακμή ενώνει κορυφές που διαφέρουν το πολύ κατά ένα επίπεδο. Αν αποκλείσουμε και τις ακμές μέσα στο ίδιο επίπεδο, τότε κάθε ακμή πάει από επίπεδο σε επίπεδο . Χρωματίζοντας τα άρτια επίπεδα κόκκινα και τα περιττά μπλε, κάθε ακμή ενώνει ένα άρτιο με ένα περιττό — δηλαδή κόκκινο με μπλε. Έγκυρος 2-χρωματισμός ⇒ διμερές. ✓

Περίπτωση 2 — υπάρχει ακμή με τα στο ίδιο επίπεδο . Θα κατασκευάσουμε έναν περιττό κύκλο. Έστω ο χαμηλότερος κοινός πρόγονος των και στο BFS-δέντρο, και έστω ότι βρίσκεται στο επίπεδο (με ).

Δούλεψε την κατασκευή βήμα-βήμα: βρες το , χάραξε τα δύο μονοπάτια του δέντρου, κλείσε τον κύκλο με την ακμή — και δες το μήκος να βγαίνει περιττό.

Κατασκευή περιττού κύκλου από ακμή ίδιου επιπέδου
Βήμα 0/6
L0L1L2L3sabcdegxy
Μήκος κύκλου
μονοπάτι z → x
μονοπάτι z → y
ακμή x – y
Σύνολο = 2 + 2 + 1
Αυτό είναι ένα BFS-δέντρο. Οι ακμές του δέντρου κατεβαίνουν πάντα ακριβώς ένα επίπεδο. Όμως η ακμή x–y ενώνει δύο κορυφές του ΙΔΙΟΥ επιπέδου — από αυτήν θα κατασκευάσουμε έναν περιττό κύκλο.

Σχηματίζουμε έναν κύκλο από τρία κομμάτια: το μονοπάτι στο δέντρο (μήκος ), το μονοπάτι (πάλι ), και την ακμή (μήκος ). Συνολικό μήκος:

Αυτό είναι περιττός αριθμός — άρα έχουμε περιττό κύκλο, και από το λήμμα το δεν είναι διμερές.

Ο αλγόριθμος

Η απόδειξη είναι ο αλγόριθμος — δεν χρειάζεται τίποτα παραπάνω από ένα BFS και μια σάρωση των ακμών.

ΑλγόριθμοςΈλεγχος διμερότητας
O(n + m)
Τρέξε BFS, χρωμάτισε τα επίπεδα εναλλάξ, και ψάξε για μία ακμή που μένει μέσα σε επίπεδο.
Είσοδος:
μη κατευθυνόμενο γράφημα G
Έξοδος:
«διμερές» (με 2-χρωματισμό) ή «όχι διμερές» (με περιττό κύκλο)

Με λόγια. Τρέξε ένα BFS από οποιαδήποτε κορυφή και κατέγραψε το επίπεδο κάθε κορυφής. Μετά σάρωσε όλες τις ακμές: αν κάποια ενώνει δύο κορυφές του ίδιου επιπέδου, σταμάτα — το γράφημα δεν είναι διμερές. Αν καμία δεν το κάνει, το γράφημα είναι διμερές, και ο χρωματισμός «άρτια επίπεδα κόκκινα, περιττά μπλε» είναι η μαρτυρία.

Πολυπλοκότητα. Ένα BFS, , και μία σάρωση των ακμών, — συνολικά .

Κάρτα μνήμηςΈλεγχος διμερότητας
Λέξεις-κλειδιά
2-χρωματισμόςδιμερές ⇔ κανένας περιττός κύκλοςBFS επίπεδα = χρώματαακμή σε ίδιο επίπεδο → όχιO(n+m)
Τα βήματα στο μυαλό σου
1Τρέξε BFS από οποιαδήποτε κορυφή· πάρε τα επίπεδα L₀, L₁, …
2Χρωμάτισε νοητά τα άρτια επίπεδα κόκκινα και τα περιττά μπλε.
3Σάρωσε κάθε ακμή — ενώνει δύο κορυφές του ίδιου επιπέδου;
4Καμία τέτοια ακμή → διμερές. Έστω και μία → περιττός κύκλος → όχι διμερές.
Πολυπλοκότητα
O(n + m)
Κλασική παγίδα
«Διμερές» ΔΕΝ σημαίνει «χωρίς κύκλους» — σημαίνει «χωρίς ΠΕΡΙΤΤΟΥΣ κύκλους». Άρτιοι κύκλοι επιτρέπονται μια χαρά. Και ο 2-χρωματισμός από τα επίπεδα δεν αποδεικνύει τίποτα μόνος του· η απόδειξη ολοκληρώνεται μόνο όταν ελέγξεις ότι καμία ακμή δεν μένει μέσα σε επίπεδο.

Κατευθυνόμενα γραφήματα

Ως τώρα οι ακμές μας ήταν αμφίδρομες: αν υπάρχει σύνδεση Αλέξης ↔ Μαρία, η ίδια ακμή με εξυπηρετεί από όποια μεριά τη διαβάσω. Αλλά οι περισσότερες ενδιαφέρουσες σχέσεις του κόσμου έχουν φορά — η ροή έχει σημασία.

  • Ιστοσελίδες: η Wikipedia δείχνει στο Google, το Google μπορεί να μη δείχνει πίσω.
  • Χρονοπρογραμματισμός εργασιών: «η εργασία α πρέπει να τελειώσει πριν την β». Το αντίθετο δεν θα είχε καν νόημα.
  • Ροή κλήσεων προγράμματος: η main καλεί την parse, η parse δεν καλεί τη main.
  • Τροφική αλυσίδα: το λιοντάρι τρώει το ελάφι, όχι ανάποδα.

Αυτό το αποτυπώνει το κατευθυνόμενο γράφημα:

όπου το σύνολο περιέχει διατεταγμένα ζευγάρια — η ακμή πάει από την προς την , σχεδιάζεται με βελάκι, και είναι διαφορετική οντότητα από την .

Δύο βαθμοί αντί για έναν

Όταν οι ακμές αποκτούν φορά, ο «βαθμός» μιας κορυφής σπάει στα δύο:

  • Εσώβαθμος — πόσα βελάκια καρφώνονται μέσα στην .
  • Εξώβαθμος — πόσα βελάκια ξεκινούν από την .

Παρατήρησε ότι κάθε ακμή προσμετράται ακριβώς μία φορά ως εξερχόμενη (στο outdeg της αφετηρίας της) και ακριβώς μία φορά ως εισερχόμενη (στο indeg του προορισμού της). Άρα αν αθροίσεις και τους δύο μετρητές πάνω σε όλες τις κορυφές, παίρνεις από δύο διαφορετικούς δρόμους την ίδια απάντηση — πόσες ακμές υπάρχουν συνολικά:

Είναι ακριβώς το λήμμα της χειραψίας του L06, σπασμένο στα δύο. Δες τους τρεις μετρητές να τικάρουν μαζί, ακμή προς ακμή — και μετά γύρνα στο tab «Κορυφή προς κορυφή» για να δεις indeg/outdeg ξεχωριστά:

Εσώβαθμος και εξώβαθμος σε κατευθυνόμενο γράφημα

Κάθε νέα ακμή ανάβει στα ΔΥΟ άκρα της — αλλά τώρα τικάρει χωριστά το outdeg της αφετηρίας και το indeg του προορισμού. Πρόσεξε τους τρεις μετρητές δεξιά.

out(1)+1 · in(2)+1v100v200v300v400v500v600
Σ indeg
0
Σ outdeg
0
|A|
0
indeg / outdeg ανά κορυφή
Καμία ακμή ακόμα. Όλα τα indeg, outdeg και Σ-αθροίσματα είναι 0. Πάτα «Επόμενη ακμή» ή ▶ — θα δούμε ότι κάθε νέα ακμή τικάρει ΕΝΑ outdeg και ΕΝΑ indeg.
0 / 8 ακμές

Η διάσχιση ακολουθεί ΜΟΝΟ τις εξερχόμενες ακμές

Το BFS (και το DFS) δουλεύουν με μία και μόνο αλλαγή: από κορυφή ακολουθούμε μόνο τις ακμές που βγαίνουν από την . Δεν έχουμε δικαίωμα να διαβάσουμε μια ακμή ανάποδα — αν στο γράφημα υπάρχει , μου επιτρέπεται να πάω από a σε b, όχι από b σε a. Ο χρόνος μένει .

Αυτό σπάει μια συμμετρία που στο μη κατευθυνόμενο τη θεωρούσαμε δεδομένη. Σε ένα συνεκτικό μη κατευθυνόμενο γράφημα, ένα BFS από οποιαδήποτε κορυφή φτάνει παντού — η αφετηρία δεν έχει σημασία. Σε κατευθυνόμενο γράφημα έχει: από κάποιες κορυφές φτάνεις σε όλους, από άλλες σχεδόν σε κανέναν, ανάλογα με το αν είσαι «ψηλά» ή «χαμηλά» στη ροή των βελών. Δες την ίδια εικόνα να αλλάζει εντελώς ετυμηγορία ανάλογα με ποια κορυφή κάνεις αφετηρία, και με τον διακόπτη «αν αγνοούσαμε τις φορές»:

Από πού φτάνεις πού — με και χωρίς τις φορές

Κάνε κλικ σε οποιαδήποτε κορυφή για να την κάνεις αφετηρία s. Πρόσεξε πώς από ίδια s, η ίδια εικόνα δίνει εντελώς διαφορετική ετυμηγορία στα δύο tabs.

Αφετηρία v1ΚατευθυνόμενοΦτάσαμε σε 0/6
v1sv2v3v4v5v6

💡 Κάνε κλικ σε άλλη κορυφή για άλλη αφετηρία — δοκίμασε ειδικά v5 ή v6 και άλλαξε tab.

Κατευθυνόμενο
0 / 6
Αδιάφορη φορά
6 / 6
Αφετηρία s = v1. Πάτα «Επόμενο» ή ▶ για να αρχίσει το BFS. Στο tab «Κατευθυνόμενο» θα δούμε σε ποιες κορυφές φτάνουμε.
Βήμα 0 / 4

Η διαφορά ανάμεσα στην αφετηρία v1 (φτάνεις σε όλους) και την v5 (φτάνεις μόνο στον εαυτό σου) είναι το πιο καθαρό αποτύπωμα της κατευθυντικότητας: ίδιο γράφημα, ίδιοι κανόνες, ριζικά διαφορετική προσβάσιμη περιοχή. Έτσι λύνεται και η κατευθυνόμενη προσπελασιμότητα: δοσμένης κορυφής , ποιες κορυφές φτάνονται από την σεβόμενοι τις φορές; — απλά ένα BFS από την που ακολουθεί μόνο εξερχόμενες ακμές.

Ισχυρή συνεκτικότητα

Στα μη κατευθυνόμενα γραφήματα, «συνεκτικό» σήμαινε «όλοι φτάνουν σε όλους» — και αν φτάσω από a στο b, ξέρω αυτόματα ότι φτάνω και από b στο a, διαβάζοντας την ίδια διαδρομή αντίστροφα. Στα κατευθυνόμενα, μόλις είδαμε, αυτή η αυτονόητη συμμετρία χάνεται: το πρώτο μπορεί να ισχύει χωρίς το δεύτερο. Άρα η έννοια της συνεκτικότητας θέλει ξανά ορισμό από την αρχή — με αυστηρότερη διατύπωση.

Δύο κορυφές λέγονται αμοιβαία προσπελάσιμες όταν υπάρχει διαδρομή και διαδρομή . Είναι δηλαδή δύο ξεχωριστές απαιτήσεις — η μία δεν τραβάει την άλλη. Ένα κατευθυνόμενο γράφημα είναι ισχυρά συνεκτικό όταν κάθε ζεύγος κορυφών είναι αμοιβαία προσπελάσιμο — όχι ένα ή δέκα, ΟΛΑ.

Δοκίμασε τον ορισμό με το χέρι. Πάρε δύο γραφήματα ίδιου σχήματος (ένας πεντάγωνος κύκλος και ο ίδιος χωρίς μία ακμή) και έλεγξε ζεύγη ένα-ένα. Πάτα μετά «Δοκίμασε όλα τα ζεύγη» για να δεις πόσα σπάει η μία και μοναδική ακμή που λείπει:

Αμοιβαία προσπέλαση — δοκίμασε ζεύγη

Κάνε κλικ σε δύο κορυφές — η πρώτη γίνεται u (μπλε), η δεύτερη v (πορτοκαλί). Πρέπει να υπάρχουν ΚΑΙ τα δύο μονοπάτια u → v και v → u για να είναι το ζεύγος «αμοιβαία προσπελάσιμο».

12u345v

💡 Δοκίμασε στο «Λείπει ακμή» το ζεύγος u = 5, v = 1: από 5 δεν φτάνεις πια στην 1.

Ζεύγος που εξετάζεις
u = 2 , v = 5
u → v: 2 → 3 → 4 → 5
v → u: 5 → 1 → 2
✓ Αμοιβαία προσπελάσιμα

Στο «καλό» γράφημα και τα δέκα ζεύγη είναι αμοιβαία προσπελάσιμα — εξ ορισμού ισχυρά συνεκτικό. Στο «σπασμένο» γράφημα, η μία ακμή που λείπει (5 → 1) τινάζει στον αέρα όλα τα ζεύγη όπου η 1 έπρεπε να φτάνεται «από κάτω»: από τις 5, 4, 3, 2 δεν φτάνεις πια στην 1, οπότε τέσσερα ζεύγη γίνονται μονόδρομα. Η μία απουσία τσακίζει τον ορισμό για το σύνολο του γραφήματος.

Ο έξυπνος έλεγχος σε γραμμικό χρόνο

Ο αφελής τρόπος — «έλεγξε κάθε ζεύγος» — είναι ακριβός. Το κλειδί είναι μια παρατήρηση που ανάγει τα ζεύγη σε μία κορυφή:

Πώς ελέγχουμε τη συνθήκη 2 — «η φτάνεται από όλους»; Με ένα κόλπο: αντίστρεψε τη φορά κάθε ακμής. Σκέψου το σαν να γυρνάς όλα τα βέλη ανάποδα — κάθε «δρόμος προς εμένα» γίνεται «δρόμος από εμένα». Στο αντεστραμμένο γράφημα , λοιπόν, «η φτάνει την » σημαίνει «στο αρχικό η φτάνει την ». Άρα ένα και μόνο BFS από την στο ελέγχει ολόκληρη τη συνθήκη 2.

Δες τα δύο BFS να τρέχουν. Διάλεξε εσύ την αφετηρία κάνοντας κλικ σε μια κορυφή — και πρόσεξε ότι, όποια κι αν διαλέξεις, η τελική ετυμηγορία δεν αλλάζει· αυτό ακριβώς εγγυάται το λήμμα.

Ισχυρή συνεκτικότητα — δύο BFS, στο G και στο Gʳᵉᵛ
Γράφημα GΚαλύφθηκαν 0/6
1s23456

💡 Κάνε κλικ σε κορυφή για να αλλάξεις την αφετηρία s — η ετυμηγορία δεν αλλάζει.

Συνθήκη 1
η s φτάνει όλους (BFS στο G)
Συνθήκη 2
όλοι φτάνουν την s (BFS στο Gʳᵉᵛ)
Αφετηρία s = 1. Κάνε κλικ σε οποιαδήποτε κορυφή για να τη δοκιμάσεις ως s — το λήμμα λέει ότι κάθε επιλογή δίνει την ίδια ετυμηγορία. Πάτα «Επόμενο».
Βήμα 0 / 12
ΑλγόριθμοςΈλεγχος ισχυρής συνεκτικότητας
O(n + m)
Δύο BFS από την ίδια αυθαίρετη κορυφή: ένα στο G, ένα στο αντεστραμμένο G.
Είσοδος:
κατευθυνόμενο γράφημα G
Έξοδος:
«ναι» αν το G είναι ισχυρά συνεκτικό, αλλιώς «όχι»

Με λόγια. Διάλεξε μια κορυφή , όποια θες. Τρέξε BFS στο από την : αν δεν φτάσουν όλες οι κορυφές, η συνθήκη 1 αποτυγχάνει — το γράφημα δεν είναι ισχυρά συνεκτικό. Αλλιώς, αντίστρεψε τη φορά κάθε ακμής και τρέξε BFS στο πάλι από την : αν δεν φτάσουν όλες, αποτυγχάνει η συνθήκη 2. Αν και τα δύο BFS κάλυψαν όλο το γράφημα, το είναι ισχυρά συνεκτικό.

Πολυπλοκότητα. Δύο BFS και μία αντιστροφή — όλα .

Κάρτα μνήμηςΙσχυρή συνεκτικότητα
Λέξεις-κλειδιά
αμοιβαία προσπέλασηδιάλεξε μία αυθαίρετη sBFS στο GBFS στο G^revO(n+m)
Τα βήματα στο μυαλό σου
1Διάλεξε οποιαδήποτε κορυφή s.
2BFS στο G από την s — φτάνουν όλες οι κορυφές;
3Αντίστρεψε τη φορά κάθε ακμής → G^rev.
4BFS στο G^rev από την s — φτάνουν πάλι όλες; Αν ναι και στα δύο → ισχυρά συνεκτικό.
Πολυπλοκότητα
O(n + m)
Κλασική παγίδα
Δεν χρειάζεται να δοκιμάσεις κάθε κορυφή ως αφετηρία — μία αυθαίρετη s αρκεί (αυτό λέει το λήμμα). Και το δεύτερο BFS πρέπει να γίνει στο ΑΝΤΕΣΤΡΑΜΜΕΝΟ γράφημα· εκεί ελέγχεται αν η s φτάνεται ΑΠΟ όλους, όχι αν φτάνει όλους.

Εισαγωγή στη συντομότερη διαδρομή με βάρη

Ως τώρα κάθε ακμή «κόστιζε» 1, και το BFS έβρισκε τη συντομότερη διαδρομή σε . Αλλά στην πράξη οι ακμές δεν είναι ισότιμες: ένας δρόμος είναι μακρύτερος από έναν άλλο, μια σύνδεση δικτύου πιο αργή.

Δίνουμε λοιπόν σε κάθε ακμή ένα βάρος , και ορίζουμε το μήκος μιας διαδρομής ως το άθροισμα των βαρών των ακμών της. Το πρόβλημα συντομότερης διαδρομής ζητάει, για δοσμένα και , τη διαδρομή με το ελάχιστο συνολικό βάρος.

s23547t921216141830Συντομότερη: s → 2 → 3 → 5 → t, μήκος 9 + 21 + 2 + 16 = 48

Πριν φτάσουμε στους αλγορίθμους, η εξέταση αγαπά μια προαπαιτούμενη ερώτηση: αν αλλάξουμε τα βάρη, διατηρείται το συντομότερο μονοπάτι;

Γιατί το BFS δεν αρκεί πια

Το BFS βρίσκει τη διαδρομή με τον μικρότερο αριθμό ακμών. Με βάρη όμως, αυτό δεν είναι το ίδιο με τη φθηνότερη διαδρομή.

Δες το λάθος να συμβαίνει. Γύρνα τον διακόπτη ανάμεσα στο «πώς μετράει το BFS» (μετράει ακμές) και στο πραγματικό κόστος (άθροισμα βαρών):

Γιατί το BFS αποτυγχάνει με βάρη

Έτσι «σκέφτεται» το BFS: κάθε ακμή μετράει 1. Διαλέγει τη διαδρομή με τις λιγότερες ακμές.

1111sabt
Απευθείας s → t
1 ακμή · βάρος 100
← η επιλογή του BFS
Μονοπάτι s → a → b → t
3 ακμές · βάρος 30
← πραγματικά συντομότερη
Το BFS μετράει ακμές, οπότε διαλέγει την απευθείας s → t — μία μόνο ακμή. Αλλά αυτή κοστίζει 100, ενώ η διαδρομή των τριών «φθηνών» ακμών κοστίζει μόλις 30. Το BFS βελτιστοποιεί λάθος μέγεθος — μετράει άλματα, όχι κόστος. Χρειαζόμαστε νέους αλγορίθμους: Dijkstra και Bellman-Ford στο L09.

Η ίδια λογική του μετασχηματισμού έχει και θετική όψη — όταν το κόστος ενός μονοπατιού είναι γινόμενο αντί για άθροισμα, ένας λογάριθμος γεφυρώνει το πρόβλημα πίσω στο γνωστό shortest path:

Και μια εντελώς διαφορετική στρατηγική για τα πολυφασικά προβλήματα — αλλάζεις τη δομή του ίδιου του γράφου αντί για τα βάρη:

Κλείδωσε τη γνώση

Βάλε στη σειρά τα βήματα του ελέγχου ισχυρής συνεκτικότητας:

Βάλε τα βήματα στη σειρά
Ο αλγόριθμος ισχυρής συνεκτικότητας, από την πρώτη ενέργεια στην τελευταία.
Σύρε τις γραμμές για αναδιάταξη — ή χρησιμοποίησε τα βελάκια.
1.Τρέξε BFS στο G^rev από την ίδια s — αν δεν φτάσουν όλες, όχι ισχυρά συνεκτικό.
2.Κατασκεύασε το G^rev αντιστρέφοντας τη φορά κάθε ακμής.
3.Τρέξε BFS στο G από την s — αν δεν φτάσουν όλες οι κορυφές, σταμάτα: όχι ισχυρά συνεκτικό.
4.Διάλεξε μία οποιαδήποτε κορυφή s.
5.Αν και τα δύο BFS έφτασαν κάθε κορυφή, το G είναι ισχυρά συνεκτικό.

Και συμπλήρωσε τα κενά για τη διμερότητα:

Συμπλήρωσε τα κενά
Ο έλεγχος διμερότητας σε τέσσερις λέξεις-κλειδιά.
Ένα γράφημα είναι διμερές αν χρωματίζεται με χρώματα ώστε κάθε ακμή να έχει διαφορετικό χρώμα στα άκρα της. Ισοδύναμα, είναι διμερές αν και μόνο αν δεν περιέχει κανέναν κύκλο. Ο έλεγχος γίνεται με ένα BFS: χρωματίζουμε τα επίπεδα εναλλάξ, και αν κάποια ακμή ενώνει δύο κορυφές του επιπέδου, δεν είναι διμερές. Όλα σε χρόνο O(n + ).

Μοτίβο σκέψης

Τι μάθαμε

Τι κρατάμε από αυτή τη διάλεξη

  1. BFS/DFS σε δράση — συνεκτικές συνιστώσες, flood fill, διμερότητα. Όλα ανάγονται σε διάσχιση και τρέχουν σε .
  2. Διμερότητα ⇔ κανένας περιττός κύκλος. Έλεγχος: BFS, χρωμάτισε τα επίπεδα εναλλάξ, και ψάξε ακμή που μένει μέσα σε επίπεδο. Μία τέτοια ακμή κλείνει περιττό κύκλο μήκους .
  3. Κατευθυνόμενα γραφήματα — ακμές με φορά, εσώβαθμος και εξώβαθμος. Η διάσχιση ακολουθεί μόνο τις εξερχόμενες ακμές.
  4. Ισχυρή συνεκτικότητα: διάλεξε μία αυθαίρετη , και κάνε δύο BFS — ένα στο , ένα στο . Αν και τα δύο καλύπτουν τα πάντα, το γράφημα είναι ισχυρά συνεκτικό. .
  5. Συντομότερη διαδρομή με βάρη: το BFS μετράει ακμές, όχι βάρος — δεν αρκεί πια. Το L09 φέρνει Dijkstra και Bellman-Ford.
Επόμενο
L09 · Γραφήματα IV — MST (Prim, Kruskal)

Ασκήσεις από εξετάσεις

Από τη θεωρία στην εξεταστική

7 άσκησεις που χρησιμοποιούν ως τελευταίο εργαλείο αυτή τη διάλεξη. Οι πρόσφατες εξεταστικές (2024/2025) φέρουν badge προτεραιότητας.

Από φροντιστήριοΦροντιστήριο 2023–24Άσκηση 6ΓραφήματαΔύσκολο

Φροντιστηριακό Σετ #5 · Άσκηση 6 — Μονοπάτι μέγιστης αξιοπιστίας

Μια αποστολή πρέπει να δρομολογηθεί από μια πόλη σε μια πόλη . Το οδικό δίκτυο είναι γράφος · για κάθε δρόμο , η τιμή είναι η πιθανότητα να διασχιστεί χωρίς επιπτώσεις. Ζητάμε δρομολόγιο που μεγιστοποιεί την πιθανότητα να φτάσει η αποστολή στον — δηλαδή μονοπάτι μέγιστης αξιοπιστίας.

1. Επίλεξε τον κατάλληλο αλγόριθμο. 2. Εφάρμοσέ τον στον γράφο με , , .

Από φροντιστήριοΦροντιστήριο 2023–24Άσκηση 7ΓραφήματαΔύσκολο

Φροντιστηριακό Σετ #5 · Άσκηση 7 — Μονοπάτι μέσα από διατεταγμένα υποσύνολα

Έστω συνεκτικός, μη κατευθυνόμενος, πλήρης γράφος με . Δίνονται ξένα ανά δύο υποσύνολα (). Σχεδίασε πολυωνυμικό αλγόριθμο (με την πολυπλοκότητά του) που βρίσκει μονοπάτι ελαχίστου μήκους κορυφών της μορφής , με για κάθε .

Από φροντιστήριοΦροντιστήριο 2023–24Άσκηση 8ΓραφήματαΔύσκολο

Φροντιστηριακό Σετ #5 · Άσκηση 8 — Πιο αναξιόπιστο μονοπάτι σε DAG

Δίνεται κατευθυνόμενος ακυκλικός γράφος · κάθε ακμή έχει βάρος που συμβολίζει την αξιοπιστία του διαύλου επικοινωνίας (πιθανότητα να μην αποτύχει η μετάδοση), με τις πιθανότητες ανεξάρτητες.

Προσδιόρισε δύο αποδοτικούς αλγορίθμους για την εύρεση του πιο αναξιόπιστου μονοπατιού από δεδομένη κορυφή : ο ένας να το αντιμετωπίζει ως πρόβλημα μονοπατιού μέγιστου κόστους, ο άλλος ως ελάχιστου κόστους, με κατάλληλους μετασχηματισμούς. Ποια η πολυπλοκότητα καθενός;

Από φροντιστήριοΦροντιστήριο 2023–24Άσκηση 9ΓραφήματαΜέτριο

Φροντιστηριακό Σετ #5 · Άσκηση 9 — Συντομότερο μονοπάτι & μετασχηματισμοί βαρών

Σ/Λ; Σε έναν γράφο με βάρη, το συντομότερο μονοπάτι μεταξύ δύο κορυφών δεν μεταβάλλεται αν όλα τα βάρη:

Α. πολλαπλασιαστούν με τον ίδιο θετικό αριθμό. Β. αυξηθούν κατά τον ίδιο θετικό αριθμό (πρόσθεση).

Από φροντιστήριοΦροντιστήριο 2023–24Άσκηση 1ΓραφήματαΔύσκολο

Φροντιστηριακό Σετ #6 · Άσκηση 1 — Σχεδιασμός ποδηλατικής εκδρομής

Είναι διαθέσιμος χάρτης με πόλεις που συνδέονται με ποδηλατικές διαδρομές. Μία διαδρομή που συνδέει δύο πόλεις έχει απόσταση . Επιπλέον, το κόστος διανυκτέρευσης στην πόλη είναι .

Καλείστε να σχεδιάσετε μία εκδρομή που διαρκεί ακριβώς ημέρες, ξεκινώντας από την πόλη και έχοντας ως προορισμό την πόλη , χωρίς διαμονή στην ίδια πόλη περισσότερες από μία συνεχόμενες ημέρες, και με μέγιστη διανυόμενη απόσταση την ημέρα ίση με . Επιπλέον, θέλουμε να ελαχιστοποιηθεί το συνολικό κόστος διαμονής.

Προσδιορίστε έναν αλγόριθμο με πολυπλοκότητα για τον σχεδιασμό εκδρομής σε πόλεις με ελάχιστο κόστος , έτσι ώστε .

Από φροντιστήριοΦροντιστήριο 2023–24Άσκηση 10ΓραφήματαΜέτριο

Φροντιστηριακό Σετ #7 · Άσκηση 10 — Συντομότερο μονοπάτι με αρνητικά βάρη;

Ο καθηγητής Εξυπνούλης προτείνει τον ακόλουθο αλγόριθμο για την εύρεση της συντομότερης διαδρομής από τον κόμβο στον κόμβο σε έναν γράφο με ακμές αρνητικού βάρους: πρόσθεση μιας σταθεράς σε κάθε βάρος ακμής ώστε όλα τα βάρη να γίνουν θετικά, και κατόπιν εκτέλεση του αλγορίθμου του Dijkstra. Λειτουργεί τώρα σωστά ο αλγόριθμος;

Φόρτωση σχολίων…
L08 · Γραφήματα ΙΙΙ — Εφαρμογές BFS, Διμερότητα, Κατευθυνόμενα · Algorithms Class Hub