L09 · Γραφήματα IV — Dijkstra & Ελάχιστα Συνδετικά Δέντρα
Τι θα δούμε
Στο L08 είδαμε ότι μόλις οι ακμές αποκτήσουν βάρη, το BFS δεν αρκεί πια. Εδώ φτιάχνουμε τους αλγορίθμους που χρειάζεται — δύο μεγάλα προβλήματα και τέσσερις αλγόριθμοι:
- Συντομότερη διαδρομή με θετικά βάρη → ο αλγόριθμος Dijkstra.
- Ελάχιστο Συνδετικό Δέντρο (ΕΣΔ / MST) → Prim, Kruskal, και η «αντίστροφη διαγραφή».
Και οι τέσσερις είναι άπληστοι: σε κάθε βήμα παίρνουν την τοπικά καλύτερη απόφαση και δεν την ξανακοιτάζουν ποτέ. Το ότι μια σειρά από «μυωπικές» επιλογές δίνει στο τέλος παγκόσμια βέλτιστη λύση δεν είναι καθόλου προφανές — η μισή διάλεξη είναι να αποδείξουμε ακριβώς αυτό.
Συντομότερη διαδρομή με βάρη
Είσοδος: κατευθυνόμενο γράφημα , και σε κάθε ακμή ένας θετικός αριθμός — το «μήκος» της. Το μήκος μιας διαδρομής είναι το άθροισμα των μηκών των ακμών της.
Ζητούμενο: για δοσμένα και , η διαδρομή με το ελάχιστο συνολικό μήκος.
Ο αλγόριθμος Dijkstra
Η ιδέα — άπληστο κύμα από την s
Πώς προσομοιώνουμε το κύμα; Κρατάμε ένα σύνολο από κορυφές που το κύμα έχει ήδη φτάσει — και για τις οποίες ξέρουμε ήδη, οριστικά, τη συντομότερη απόσταση από την . Στην αρχή το κύμα μόλις ξεκινάει: , .
Σε κάθε βήμα μεγαλώνουμε το με μία ακόμα κορυφή — αυτή που το κύμα θα ακουμπήσει αμέσως μετά. Για να τη βρούμε, για κάθε κορυφή έξω από το ρωτάμε: «αν την πλησιάσω σε ένα μόνο βήμα από κάποια ήδη οριστικοποιημένη κορυφή , ποιο είναι το φθηνότερο που μου δίνει το ;» Αυτό είναι η εκτίμηση :
Η άπληστη επιλογή: παίρνουμε την με το μικρότερο — αυτή που το κύμα θα ακουμπήσει πρώτη — θέτουμε , και τη βάζουμε στο . Ποτέ ξανά δεν την ξανακοιτάμε.
Ο αλγόριθμος
- Είσοδος:
- κατευθυνόμενο γράφημα G με θετικά βάρη, και πηγή s
- Έξοδος:
- η συντομότερη απόσταση d[v] από την s προς κάθε v (και οι γονείς π[v] για τη διαδρομή)
Με λόγια. Αρχικά και για κάθε άλλη κορυφή — όλες μπαίνουν σε μια ουρά προτεραιότητας με κλειδί το . Επαναλαμβανόμενα, εξάγουμε την κορυφή με το μικρότερο : αυτή οριστικοποιείται. Μετά χαλαρώνουμε (relax) κάθε εξερχόμενη ακμή — αν η διαδρομή μέσω της είναι φθηνότερη από την τρέχουσα εκτίμηση , την ενημερώνουμε. Συνεχίζουμε ώσπου η ουρά να αδειάσει.
Δες τον να τρέχει. Πρόσεξε δύο πράγματα: τη στιγμή που μια κορυφή γίνεται πράσινη (οριστικοποιείται — η απόστασή της δεν θα ξαναλλάξει), και τις στιγμές που ένα πέφτει όταν βρεθεί φθηνότερη διαδρομή:
Πράσινο = οριστικοποιημένη (στο S) · κόκκινο = εξάγεται τώρα · κίτρινο = μόλις βελτιώθηκε.
Γιατί είναι σωστός — αναλλοίωτη με επαγωγή στο
Βάση. : μόνο η είναι μέσα, με — προφανώς η συντομότερη διαδρομή προς τον εαυτό της. ✓
Επαγωγικό βήμα. Υποθέτουμε ότι η αναλλοίωτη ισχύει όσο . Έστω η κορυφή που μπαίνει στο στο επόμενο βήμα — αυτή με το ελάχιστο — και έστω η ακμή που το πετυχαίνει, ώστε . Θα δείξουμε ότι καμία διαδρομή δεν είναι φθηνότερη από .
Πάρε λοιπόν μια οποιαδήποτε διαδρομή . Καθώς η ξεκινά μέσα στο (στην ) και καταλήγει έξω (στην ), κάποια στιγμή βγαίνει: έστω η πρώτη της ακμή με , , και το αρχικό κομμάτι . Τότε:
Άρα κάθε διαδρομή προς την κοστίζει , οπότε το είναι όντως το συντομότερο.
Η απόδειξη γίνεται πολύ πιο χειροπιαστή αν την τρέξεις. Διάλεξε οποιαδήποτε διαδρομή και δες την αλυσίδα να χτίζεται κρίκο-κρίκο — και να καταλήγει πάντα στο ίδιο σημείο, :
Πράσινο = μέσα στο S (οριστικοποιημένες) · μωβ = η διαδρομή P που διάλεξες · χρυσό = η πρώτη ακμή που φεύγει από το S.
Δεν είναι αφηρημένη απειλή. Ένας τετρακόρυφος γράφος με μία αρνητική ακμή φτάνει για να βάλει τον Dijkstra να επιστρέψει λάθος απάντηση. Πάτα «επόμενο» και δες ακριβώς τη στιγμή που η u «κλειδώνει» στο αν και η αληθινή της απόσταση είναι — και πώς αυτό το μικρό ψέμα μετά κάνει την να είναι 5 αντί για 3:
Τέσσερις κορυφές, τέσσερις ακμές, μία αρνητική. Δες πώς ο Dijkstra οριστικοποιεί την u πολύ νωρίς — και πληρώνει το τίμημα στην t.
Από εδώ προκύπτει και ο επόμενος αλγόριθμος, ο Bellman-Ford σε L17: επαναπροσπαθεί τη χαλάρωση κάθε ακμής σε κάθε γύρο, αντί να εμπιστεύεται την «οριστικοποίηση». Πληρώνει με — αλλά αντέχει αρνητικά βάρη και, ως μπόνους, εντοπίζει αρνητικούς κύκλους.
Πολυπλοκότητα
Όλο το κόστος είναι στις δύο πράξεις της ουράς προτεραιότητας:
- φορές
extractMin— μία ανά κορυφή. - Μέχρι φορές
decreaseKey— το πολύ μία ανά ακμή.
Με έναν δυαδικό σωρό (heap, L10) κάθε πράξη κοστίζει , οπότε συνολικά για συνεκτικά γραφήματα. (Με απλό πίνακα αντί σωρού: — προτιμότερο για πυκνά γραφήματα. Με Fibonacci heap: , πέρα από την ύλη.)
Ελάχιστο Συνδετικό Δέντρο (ΕΣΔ)
Διατύπωση
Είσοδος: μη κατευθυνόμενο συνεκτικό γράφημα , με κόστος σε κάθε ακμή.
Ένα συνδετικό δέντρο (spanning tree) είναι ένα υποσύνολο ακμών που (1) είναι δέντρο — συνεκτικό και ακυκλικό — και (2) αγγίζει όλες τις κορυφές. Από το L06, ένα τέτοιο δέντρο έχει ακριβώς ακμές.
Ζητούμενο: το συνδετικό δέντρο ελάχιστου συνολικού κόστους — αυτό που ελαχιστοποιεί το .
Πού χρησιμεύει στην πράξη: σχεδίαση φθηνότερων δικτύων (ηλεκτρικά, υδρευτικά, καλωδιακά, οδικά)· προσεγγιστικοί αλγόριθμοι για NP-δύσκολα προβλήματα (περιοδεύων πωλητής, δέντρο Steiner)· ανάλυση συστάδων (clustering)· το spanning-tree protocol των Ethernet, που σπάει τους βρόχους ενός δικτύου.
Γιατί δεν δοκιμάζουμε απλώς όλα τα δέντρα
Μια χαζή ιδέα πρώτη: «αν θες ελάχιστο, δοκίμασε τα πάντα — κάθε δυνατό συνδετικό δέντρο — και κράτα το φθηνότερο». Φαίνεται δουλειά υπολογιστή· για ένα γράφημα 10 κορυφών δεν θα μπορούσε να αργήσει τόσο, σωστά;
Το θεώρημα του Cayley σε προσγειώνει: το πλήρες γράφημα έχει διαφορετικά συνδετικά δέντρα. Δεν είναι «κάποιες δεκάδες» — είναι έκρηξη. Σύρε το παρακάτω και δες πόσο γρήγορα ο αριθμός σταματάει να χωράει σε χαρτί:
Το πλήρες γράφημα K₆ έχει nn−2 διαφορετικά συνδετικά δέντρα. Μετακίνησε το n για να δεις πόσο γρήγορα εκτοξεύεται.
Πέραν του , η εξαντλητική απαρίθμηση είναι πρακτικά αδύνατη — δεν προλαβαίνουμε ούτε στα γρηγορότερα μηχανήματα του πλανήτη. Χρειαζόμαστε αλγόριθμο που χτίζει το βέλτιστο δέντρο χωρίς να δει τα υπόλοιπα.
Κύκλοι, αποκοπές, και γιατί η απληστία δουλεύει
Πριν αποδείξουμε ότι Prim και Kruskal είναι σωστοί, χρειαζόμαστε ένα εργαλείο: την έννοια της αποκοπής.
Μια αποκοπή (cut) είναι απλώς ένας χωρισμός των κορυφών σε δύο μέρη — ένα υποσύνολο και το υπόλοιπο . Το σύνολο ακμών αποκοπής είναι οι ακμές με το ένα άκρο στο και το άλλο έξω — αυτές που «διασχίζουν» τη γραμμή.
Δες το με τα χέρια σου. Κάνε κλικ στις κορυφές για να φτιάξεις τη δική σου αποκοπή : οι ακμές που τη διασχίζουν — το — ανάβουν χρυσές, και η φθηνότερη απ' αυτές πρασινίζει. Δοκίμασε όσες διαφορετικές αποκοπές θέλεις και κράτησε μια παρατήρηση για την ελάχιστη χρυσή ακμή — θα της δώσουμε όνομα σε λίγο:
Κάνε κλικ σε κορυφή για να μπει / βγει από το σύνολο A · γαλάζιο = μέσα στο A · χρυσό = ακμές αποκοπής D(A) · πράσινο = η ελάχιστη.
💡 Κάνε κλικ στις κορυφές — η ελάχιστη ακμή της αποκοπής βγαίνει πάντα ακμή του ΕΣΔ.
Και ένα λήμμα-εργαλείο — απλό στην απόδειξη, αλλά κάνει το «βρώμικο» επιχείρημα ανταλλαγής που έρχεται μετά να δουλέψει χωρίς τρύπες:
Δοκίμασέ το με τα χέρια σου. Διάλεξε έναν κύκλο, διάλεξε μια αποκοπή, και περπάτησε γύρω-γύρω: ο μετρητής των διασχίσεων ποτέ δεν καταλήγει σε περιττό αριθμό. Όση φαντασία κι αν βάλεις στο πώς θα κόψεις τις κορυφές, ο κύκλος πρέπει να επιστρέψει — και η ισορροπία είσοδος-έξοδος είναι αναπόφευκτη:
Διάλεξε έναν κύκλο και μια αποκοπή. Πάτα «επόμενο» για να περπατήσεις γύρω-γύρω: κάθε ακμή που σε πάει «μέσα ↔ έξω» αυξάνει τον μετρητή.
💡 Γαλάζιο = μέσα στο A · πορτοκαλί περίγραμμα = πάνω στον κύκλο · κόκκινο = ακμή κύκλου που διασχίζει την αποκοπή.
Η ιδιότητα αποκοπής
Απόδειξη με ανταλλαγή. Έστω η ελάχιστη ακμή της αποκοπής, και έστω, για άτοπο, ένα ΕΣΔ που δεν την περιέχει.
- Προσθέτοντας την στο σχηματίζεται ακριβώς ένας κύκλος (δέντρο + μία ακμή = ένας κύκλος).
- Η ανήκει και στον και στο . Από το λήμμα κύκλου-αποκοπής, η τομή έχει άρτιο πλήθος — άρα υπάρχει και άλλη ακμή σε αυτή την τομή.
- Φτιάξε . Αφαιρώντας μια ακμή του κύκλου, το παραμένει συνδετικό δέντρο.
- Αφού η είναι η ελάχιστη του και η είναι κι αυτή στο , ισχύει , άρα — και το περιέχει την . Άρα υπάρχει ΕΣΔ με την .
Η ιδιότητα κύκλου
Απόδειξη — συμμετρική. Έστω η ακριβότερη ακμή του κύκλου, και έστω, για άτοπο, ένα ΕΣΔ που την περιέχει.
- Αφαιρώντας την από το , το δέντρο σπάει σε δύο κομμάτια — δηλαδή ορίζεται μια αποκοπή .
- Η ανήκει και στον και στο . Από το λήμμα, υπάρχει και άλλη ακμή στην τομή .
- Φτιάξε — η ξαναενώνει τα δύο κομμάτια, οπότε το είναι συνδετικό δέντρο.
- Αφού η είναι η ακριβότερη του , ισχύει , άρα — αντίφαση με το ότι το ήταν ελάχιστο.
Και οι δύο αποδείξεις είναι, κυριολεκτικά, η ίδια κίνηση: πρόσθεσε ή αφαίρεσε μία ακμή, άφησε το λήμμα κύκλου-αποκοπής να σου δώσει μια δεύτερη ακμή, και κάνε την ανταλλαγή. Δες την να εκτελείται — γύρνα τον διακόπτη ανάμεσα στις δύο ιδιότητες και πρόσεξε πόσο όμοια κινούνται:
Ο αλγόριθμος του Prim
Η ιδέα. Μεγάλωσε ένα δέντρο προς τα έξω. Σε κάθε στιγμή η αποκοπή είναι «κορυφές μέσα στο δέντρο» vs «κορυφές έξω». Από την ιδιότητα αποκοπής, η φθηνότερη ακμή που διασχίζει αυτή τη γραμμή ανήκει σίγουρα στο ΕΣΔ — οπότε την προσθέτουμε, χωρίς δισταγμό.
- Είσοδος:
- μη κατευθυνόμενο συνεκτικό γράφημα G με κόστη ακμών
- Έξοδος:
- ένα ελάχιστο συνδετικό δέντρο T
Με λόγια. Κάθε κορυφή κρατά ένα κλειδί — το κόστος της φθηνότερης μίας ακμής που τη συνδέει με το τρέχον δέντρο. Ξεκινάμε από μια κορυφή με . Επαναλαμβανόμενα εξάγουμε την κορυφή με το μικρότερο κλειδί, την προσθέτουμε στο δέντρο μαζί με την ακμή που την έφερε, και ενημερώνουμε τα κλειδιά των γειτόνων της που είναι ακόμα έξω.
Δες τον Prim να μεγαλώνει το δέντρο, μία κορυφή τη φορά. Σε κάθε βήμα πρόσεξε την αποκοπή που ορίζει το δέντρο — πράσινο μέσα, λευκό έξω — και τη χρυσή ακμή: τη φθηνότερη που τη διασχίζει, αυτήν ακριβώς που η ιδιότητα αποκοπής εγγυάται πως ανήκει στο ΕΣΔ.
Πράσινο = στο δέντρο · χρυσό διακεκομμένο = ακμές που διασχίζουν την αποκοπή · παχιά πράσινη = μόλις προστέθηκε · α[v] = κόστος της φθηνότερης ακμής προς το δέντρο.
Η διαφορά ακούγεται μικρή ως μια γραμμή σε ψευδοκώδικα — αλλά αλλάζει αυτό που λύνουν οι δύο αλγόριθμοι. Τρέξε τους παράλληλα στο ίδιο γράφημα από την ίδια αφετηρία: συμβαδίζουν μέχρι κάποιο σημείο, ύστερα διαφέρουν, και καταλήγουν σε διαφορετικά δέντρα — γιατί λύνουν διαφορετικά προβλήματα:
Και οι δύο αλγόριθμοι παίρνουν διαδοχικά την κορυφή με το μικρότερο κλειδί. Πρόσεξε τι σημαίνει «κλειδί» σε κάθε περίπτωση.
Πρόσεξε δύο πράγματα στο τέλος: ο Prim βγάζει δέντρο μικρότερου συνολικού κόστους (όπως πρέπει — είναι ΕΣΔ), αλλά η διαδρομή που σου δίνει το δέντρο του Prim από την αρχή σε κάποιες κορυφές είναι μεγαλύτερη από τη συντομότερη. Ο Dijkstra κάνει το ανάποδο: δεν δίνει ΕΣΔ, αλλά κάθε διαδρομή στο δέντρο του είναι όντως η συντομότερη. Διαφορετικοί στόχοι, διαφορετικά βέλτιστα.
Πολυπλοκότητα: ίδια ανάλυση με τον Dijkstra — extractMin και μέχρι decreaseKey, άρα με σωρό ( με απλό πίνακα).
Ο αλγόριθμος του Kruskal
Η ιδέα. Ξέχνα τη γεωμετρία — δούλεψε μόνο με τη λίστα ακμών. Ταξινόμησέ τες σε αύξουσα σειρά κόστους και σάρωσέ τες:
- Αν η ακμή ενώνει δύο κορυφές που είναι ήδη συνδεδεμένες, θα έκλεινε κύκλο — και είναι η ακριβότερη του κύκλου (όλες οι προηγούμενες ήταν φθηνότερες). Από την ιδιότητα κύκλου, την παραλείπουμε.
- Αλλιώς η ακμή ενώνει δύο ξεχωριστά κομμάτια· είναι η ελάχιστη ακμή στην αποκοπή που τα χωρίζει. Από την ιδιότητα αποκοπής, την προσθέτουμε.
- Είσοδος:
- μη κατευθυνόμενο συνεκτικό γράφημα G με κόστη ακμών
- Έξοδος:
- ένα ελάχιστο συνδετικό δέντρο T
Με λόγια. Ταξινόμησε όλες τις ακμές κατά αύξον κόστος. Ξεκίνα με κάθε κορυφή σε δικό της σύνολο — ένα δάσος από μεμονωμένες κορυφές. Πάρε τις ακμές με τη σειρά: για την , αν οι και είναι σε διαφορετικά σύνολα, πρόσθεσέ τη στο δέντρο και ένωσε τα δύο σύνολα· αν είναι στο ίδιο, παράλειψέ τη. Σταμάτα όταν το δέντρο φτάσει τις ακμές.
Δες τον Kruskal να σαρώνει τις ταξινομημένες ακμές. Κάθε χρώμα είναι ένα ξεχωριστό κομμάτι του δάσους· πρόσεξε δύο κομμάτια να συγχωνεύονται σε ένα μόλις μια ακμή γίνεται δεκτή — και μια ακμή να απορρίπτεται ακριβώς τη στιγμή που θα έκλεινε κύκλο:
Κάθε χρώμα = ένα συνεκτικό κομμάτι του δάσους. Ακμή σε δύο χρώματα → ενώνει· ακμή σε ένα χρώμα → θα έκλεινε κύκλο.
Πολυπλοκότητα. Η ταξινόμηση των ακμών κοστίζει . Οι πράξεις Find/Union, με τη δομή Union-Find (union-by-rank + path compression), κοστίζουν , όπου η — η αντίστροφη συνάρτηση Ackermann — είναι πρακτικά σταθερά. Άρα κυριαρχεί η ταξινόμηση: .
Μια τρίτη παραλλαγή: αντίστροφη διαγραφή
Λιγότερο γνωστή αλλά πανέμορφη — και αξίζει να την παίξεις τουλάχιστον μία φορά για να σου μπει στο μυαλό η ιδιότητα κύκλου με τη μορφή εργαλείου.
Η ιδέα. Κάνε το ακριβώς αντίθετο του Kruskal. Ξεκίνα με όλες τις ακμές μέσα — δηλαδή με όλο το γράφημα — και σάρωσέ τες σε φθίνουσα σειρά κόστους. Για κάθε ακμή ρώτα: αν την αφαιρέσω, μένει το γράφημα συνεκτικό; Αν ναι, διέγραψέ τη οριστικά. Αλλιώς, ήταν γέφυρα — βάλ' τη πίσω.
Γιατί δουλεύει. Όταν η αφαίρεση δεν αποσυνδέει, σημαίνει ότι υπάρχει εναλλακτική διαδρομή ανάμεσα στα δύο άκρα — δηλαδή η ακμή ήταν μέρος ενός κύκλου. Κι αφού σαρώνουμε από την ακριβότερη προς τη φθηνότερη, η ακμή που εξετάζουμε ήταν η ακριβότερη εκείνου του κύκλου: όλες οι υπόλοιπές του ακμές, που έδιναν την εναλλακτική διαδρομή, ήταν φθηνότερες (αλλιώς θα τις είχαμε ήδη συναντήσει). Η ιδιότητα κύκλου μας εγγυάται ότι αυτή η ακριβότερη ακμή δεν ανήκει σε κανένα ΕΣΔ — άρα δικαιολογημένα τη διώχνουμε για πάντα.
Δες τον αλγόριθμο να σαρώνει και δες την αλλαγή φωνής στη μέση της λίστας: στις 6 ακριβότερες απαντάει «διέγραψε», στις 6 φθηνότερες αρχίζει να απαντάει «κράτησέ τη — γέφυρα». Παρατήρησε επίσης τι μένει στο τέλος — ακριβώς το ΕΣΔ που έβγαλαν και ο Prim και ο Kruskal:
Σαρώνουμε τις ακμές σε φθίνουσα σειρά κόστους. Για καθεμία: αν η αφαίρεση αφήσει το γράφημα συνεκτικό, οριστική διαγραφή (ιδιότητα κύκλου). Αλλιώς, ήταν γέφυρα — την κρατάμε.
Πράσινο = συνεκτικό κομμάτι της A στη δοκιμή · ροζ = αποκόπηκε · παχιά πράσινη ακμή = στο ΕΣΔ · διακεκομμένη γκρι = έχει διαγραφεί.
Πολυπλοκότητα: πάλι , αν ο έλεγχος «αποσυνδέεται;» γίνει με κάποια έξυπνη δομή (π.χ. δυναμική συνεκτικότητα). Δεν χρησιμοποιείται συχνά στην πράξη, αλλά είναι το πιο καθαρό παράδειγμα της ιδιότητας κύκλου εν δράσει.
Prim ή Kruskal;
| Prim | Kruskal | |
|---|---|---|
| Τι μεγαλώνει | ένα δέντρο, από μία κορυφή | ένα δάσος που σιγά-σιγά συγχωνεύεται |
| Βασίζεται στην | ιδιότητα αποκοπής | ιδιότητες αποκοπής & κύκλου |
| Δομή δεδομένων | ουρά προτεραιότητας στις κορυφές | ταξινόμηση + Union-Find |
| Πολυπλοκότητα | ||
| Βολικότερος για | πυκνά γραφήματα | αραιά γραφήματα |
Και οι δύο δίνουν το ίδιο ΕΣΔ (όταν τα κόστη είναι μοναδικά) — αλλά με διαφορετική σειρά προσθήκης ακμών. Στην εξέταση συχνά ζητείται να τρέξεις και τους δύο στο ίδιο γράφημα: πρόσεξε ότι η σειρά διαφέρει, το αποτέλεσμα όχι.
Κλείδωσε τη γνώση
Βάλε στη σειρά τα βήματα του Dijkstra:
Και συμπλήρωσε τα κενά για τις δύο ιδιότητες του ΕΣΔ:
Τέλος, βάλε στη σειρά τα βήματα του Kruskal:
Μοτίβο σκέψης
Τι μάθαμε
Τι κρατάμε από αυτή τη διάλεξη
- Dijkstra — άπληστος αλγόριθμος για συντομότερες διαδρομές με θετικά βάρη. Κάθε βήμα οριστικοποιεί την πιο κοντινή κορυφή που μένει και χαλαρώνει τις ακμές της. με σωρό.
- ΕΣΔ — το συνδετικό δέντρο ( ακμές) ελάχιστου συνολικού κόστους.
- Ιδιότητα αποκοπής — η ελάχιστη ακμή κάθε αποκοπής ανήκει στο ΕΣΔ. Ιδιότητα κύκλου — η μέγιστη ακμή κάθε κύκλου δεν ανήκει.
- Prim — μεγαλώνει ένα δέντρο από μία κορυφή, διαλέγοντας τη φθηνότερη ακμή που το επεκτείνει (ιδιότητα αποκοπής). .
- Kruskal — σαρώνει τις ακμές σε αύξουσα σειρά κόστους, προσθέτοντας όποια δεν κλείνει κύκλο (Union-Find). .
- Και οι τρεις άπληστοι του ΕΣΔ δίνουν το ίδιο δέντρο — η ορθότητά τους είναι επιχείρημα ανταλλαγής, η ίδια λογική που θα κυριαρχήσει στα L11–L13.
Ασκήσεις από εξετάσεις
Από τη θεωρία στην εξεταστική
16 άσκησεις που χρησιμοποιούν ως τελευταίο εργαλείο αυτή τη διάλεξη. Οι πρόσφατες εξεταστικές (2024/2025) φέρουν badge προτεραιότητας.
Ιούνιος 2025 · Θέμα 1.6 — Άπληστο κριτήριο του Dijkstra
Με ποιο άπληστο κριτήριο λειτουργεί ο αλγόριθμος του Dijkstra;
(i) Επιλογή συντομότερου γείτονα από την τελευταία ακμή που προστέθηκε · (ii) Επιλογή της κορυφής με τη μικρότερη απόσταση από την αφετηρία · (iii) Επιλογή ακμής ελάχιστου βάρους σε μία δεδομένη τομή · (iv) Επιλογή του συντομότερου σε πλήθος ακμών μονοπατιού.
Ιούνιος 2025 · Θέμα 2.2 — Πλήθος ελάχιστων συνδετικών δέντρων
Δίνεται το παρακάτω μη-κατευθυνόμενο γράφημα με 6 κορυφές και ακμές (με τα βάρη τους):
(α΄) Πόσα διαφορετικά ελάχιστα επικαλύπτοντα δέντρα (ΕΕΔ) έχει το γράφημα; (β΄) Σχεδίασε τα διαφορετικά ΕΕΔ (αν υπάρχουν).
Σεπτέμβριος 2025 · Θέμα 1.5 — Αλγόριθμοι & αρνητικά βάρη
Ποιος/οι από τους παρακάτω αλγόριθμους δεν λειτουργεί ορθά σε γραφήματα που έχουν αρνητικά βάρη στις ακμές τους;
(i) Αλγόριθμος Prim · (ii) Αλγόριθμος Αναζήτησης κατά Πλάτος (BFS) · (iii) Αλγόριθμος Dijkstra · (iv) Αλγόριθμος Bellman-Ford.
Σεπτέμβριος 2025 · Θέμα 2.1 — Εκτέλεση του αλγορίθμου Dijkstra
Εφάρμοσε τον αλγόριθμο του Dijkstra στο παρακάτω γράφημα με αφετηρία την κορυφή . Η απάντηση αρκεί να περιέχει τον πλήρη πίνακα που διατηρεί ο Dijkstra σε κάθε βήμα. Το γράφημα έχει 6 κορυφές και τις ακμές (με τα βάρη τους):
Ιούνιος 2024 · Θέμα 1 — Κατασκευή γραφήματος & εκτέλεση Dijkstra
(α) (10 μονάδες) Να κατασκευάσεις ένα κατευθυνόμενο γράφημα με πέντε κορυφές, εκ των οποίων μία θα είναι η κορυφή-πηγή (με εισερχόμενο βαθμό 0), 5 ακμές, και ένα μη-αρνητικό κύκλο, για το οποίο ο αλγόριθμος του Dijkstra λειτουργεί σωστά. Να αιτιολογήσεις σύντομα την απάντησή σου.
(β) (10 μονάδες) Να εφαρμόσεις πλήρως κατάλληλο αλγόριθμο στο γράφημα ώστε να υπολογίσεις σωστά τη συντομότερη απόσταση όλων των κορυφών από την . Να κατασκευάσεις έναν πίνακα ο οποίος για κάθε βήμα θα δείχνει τις τρέχουσες αποστάσεις από την .
Σεπτέμβριος 2024 · Θέμα 2α — Δίκτυο δρόμων με μη-μοναδικό ΕΕΔ
Δίνεται ένα δίκτυο επαρχιακών πόλεων στο ίδιο υψόμετρο, συνδεδεμένων με αυτοκινητόδρομους. Εν όψει του χειμώνα, οι πόλεις θέλουν να μπορούν να καθαρίζουν το συντομότερο συνολικό μήκος δρόμων ώστε να παραμένει δυνατή η μετάβαση από κάθε πόλη σε κάθε άλλη. Το δίκτυο έχει 5 πόλεις και τους δρόμους: .
(α) Δώσε κατάλληλα μήκη στους δρόμους ώστε να μην υπάρχει μοναδική βέλτιστη λύση, και αιτιολόγησε γιατί η λύση δεν είναι μοναδική.
Σεπτέμβριος 2024 · Θέμα 2β — Εφαρμογή αλγορίθμου ΕΕΔ
(β) Εφάρμοσε κατάλληλο αλγόριθμο — αναφέροντας υποχρεωτικά ποιος είναι — στο παραπάνω οδικό δίκτυο για να βρεις μία βέλτιστη λύση (με τα μήκη που έδωσες στο ερώτημα α).
Φροντιστηριακό Σετ #6 · Άσκηση 2 — 2η/3η ελαφρύτερη ακμή στο MST
Έστω ένας απλός συνεκτικός γράφος, του οποίου κάθε ακμή έχει διαφορετικό βάρος. Αποδείξτε αν τα ακόλουθα είναι σωστά ή λαθεμένα:
Α. Η ακμή με το δεύτερο μικρότερο βάρος ανήκει στο ελάχιστο δέντρο επικάλυψης (MST) του .
Β. Η ακμή με το τρίτο μικρότερο βάρος ανήκει στο ελάχιστο δέντρο επικάλυψης (MST) του .
Φροντιστηριακό Σετ #7 · Άσκηση 11 — Σωστό/Λάθος για MST και Dijkstra
Να αποδείξετε αν είναι σωστές ή λάθος οι παρακάτω εκφράσεις:
(i) Αν ο γράφος έχει περισσότερες από ακμές και υπάρχει μια μοναδική ακμή μέγιστου βάρους, τότε αυτή η ακμή δεν μπορεί να είναι τμήμα ενός ΔΕΕΚ (δέντρου επικάλυψης ελάχιστου κόστους).
(ii) Το δέντρο διαδρομών μικρότερου βάρους που υπολογίζεται από τον αλγόριθμο του Dijkstra είναι υποχρεωτικά ένα ΔΕΕΚ.
(iii) Έστω γράφος με διαφορετικά βάρη σε κάθε ακμή. Τότε ο έχει μοναδικό ΔΕΕΚ.
Φροντιστηριακό Σετ #7 · Άσκηση 3 — Άπληστη προσέγγιση του TSP μέσω MST
Δίνεται ένας πλήρης γράφος με κόμβους, ακμές και συνάρτηση βαρών. Δώστε έναν άπληστο αλγόριθμο σε ψευδογλώσσα που βρίσκει μια εφικτή λύση του προβλήματος του πλανόδιου πωλητή (TSP). Υπολογίστε την πολυπλοκότητά του όταν ο γράφος είναι τάξης .
Φροντιστηριακό Σετ #7 · Άσκηση 6 — Αναβάθμιση τηλεφωνικού δικτύου (MST)
Το τηλεφωνικό δίκτυο μιας χώρας πρέπει να αναβαθμιστεί για ταχύτερη μεταφορά δεδομένων. Το κόστος αναβάθμισης μιας γραμμής ανάμεσα σε δύο κόμβους είναι ανάλογο του μήκους της.
i. Διατυπώστε άπληστο αλγόριθμο που ελαχιστοποιεί το κόστος αναβάθμισης, έτσι ώστε για κάθε δύο κόμβους να υπάρχει ακριβώς μία αναβαθμισμένη διαδρομή σύνδεσης και το συνολικό κόστος να είναι το ελάχιστο δυνατό. ii. Δώστε την πολυπλοκότητα χρόνου.
Ιούνιος 2023 · Θέμα 3Α — Το Hamiltonian Path ανήκει στο NP
Hamiltonian Path (Η): δίνεται γράφος με κόμβους και δύο κόμβοι και . Υπάρχει μονοπάτι από τον στον που περνά από κάθε κόμβο του ακριβώς μία φορά;
Δείξε ότι το πρόβλημα ανήκει στην κλάση NP.
Ιούνιος 2023 · Θέμα 3Β — Το πρόβλημα απόφασης MST σε NP και σε P
Minimum Spanning Tree (MST): δίνεται γράφος με κόμβους και μη αρνητικά βάρη στις ακμές μέσω της . Να βρεθεί ένα συνδετικό δέντρο (spanning tree) ελαχίστου βάρους.
i. Γράψε το αντίστοιχο πρόβλημα απόφασης . ii. Δείξε ότι . iii. Δείξε ότι .
Σεπτέμβριος 2023 · Θέμα 4 — Υπόδεντρο ελάχιστου βάρους & κλάσεις P/NP
Θεωρήστε ένα γράφο με , και μια συνάρτηση που ορίζει θετικά ακέραια βάρη στις πλευρές. Έστω . Θέλουμε να βρούμε ένα δέντρο υπογράφο του ελάχιστου βάρους που περιέχει το . Θεωρήστε το πρόβλημα όπου .
(i) Να γραφεί το πρόβλημα απόφασης του . (ii) Να δειχθεί ότι ανήκει στην κλάση . (iii) Να δειχθεί ότι ανήκει στην κλάση .
Ιούνιος 2022 · Θέμα 1 — Ανεξάρτητο σύνολο: NP και P για σταθερό k
Θεωρήστε το πρόβλημα του ανεξάρτητου συνόλου:
INDEP: Δοθέντος ενός μη κατευθυνόμενου γράφου με κόμβους και ενός μη αρνητικού ακεραίου , περιέχει ο -ανεξάρτητο σύνολο; (Ένα -ανεξάρτητο σύνολο είναι κόμβοι που ανά 2 δεν συνδέονται με ακμή.)
i. Αποδείξτε ότι το πρόβλημα INDEP ανήκει στην κλάση .
ii. Αποδείξτε ότι όταν το έχει σταθερή τιμή, π.χ. , τότε το πρόβλημα INDEP ανήκει στην κλάση . (Να περιγραφεί σύντομα σε φυσική γλώσσα ο αλγόριθμος και να δοθεί η πολυπλοκότητα.)
Ιούνιος 2022 · Θέμα 4 — Προβλήματα απόφασης MST & TSP
Θεωρήστε τα προβλήματα: ελαχιστοποίηση κόστους ενός δέντρου επικάλυψης (mst) σε ένα γράφο, και ελαχιστοποίηση του κόστους ενός Χαμιλτονιανού κύκλου (TSP) σε έναν πλήρη γράφο.
i. Να δοθούν τα αντίστοιχα προβλήματα απόφασης και .
ii. Με την υπόθεση ότι : το ανήκει στην ; στην ; είναι -complete; Και αντίστοιχα για το .