Άπληστοι Αλγόριθμοι ΙΙI Αλγόριθμοι γραφημάτων Ελάχιστο Γεννητικό Δένδρο Παράδειγμα Κατασκευή δικτύων Οδικά, επικοινωνίας Έχουμε ένα συνεκτικό γράφημα (V,E) και ένας βάρος we σε κάθε ακμή e. Να βρεθεί υποσύνολο των ακμών T E, έτσι ώστε το γράφημα να είναι συνεκτικό και το συνολικό κόστος των ακμών να είναι όσο το δυνατόν μικρότερο Η λύση πρέπει να είναι δένδρο Ο αλγόριθμος του Prim Ξεκινάμε από μια κορυφή s και κατασκευάζουμε ένα δένδρο Παράδειγμα - Αλγόριθμος Prim Ο αλγόριθμος του Kruskal Σε κάθε βήμα προσθέτουμε την κορυφή που μπορεί να προσαρτηθεί στο δένδρο με το μικρότερο κόστος. S {s}. While S V..Επέλεξε την ακµή e=(u,v) µε το µικρότερο κόστος έτσι ώστε (u ή v) S και (v ή u) V-S Σε κάθε βήμα προσθέτουμε την ακμή με το μικρότερο κόστος που ενώνει δύο ασύνδετα μέρη (δεν δημιουργεί κύκλο) Μπορεί να υλοποιηθεί γρήγορα με τη δομή δεδομένων Union-find σε O(mlogn)..S S {v ή u}..pred[(u ή v)] v ή u Παράδειγμα - Αλγόριθμος Kruskal Γιατί δουλεύουν αυτοί οι αλγόριθμοι; Παράδειγμα - Ασφαλείς ακμές Ορισμός: Δεδομένου ενός γράφου G=(V,E), μια κοπή του G είναι μια διαμοίραση του V σε δύο υποσύνολα S και V-S Λήμμα: Για κάθε κοπή του G σε S και V-S, υπάρχει ένα ελάχιστο γεννητικό δένδρο που χρησιμοποιεί μία από τις ακμές ελαχίστου κόστους που «διατρέχουν» την κοπή (συνδέουν το S με το V-S) Ας πούμε αυτές τις ακμές ασφαλείς
Ο Αλγόριθμος Prim διαλέγει πάντα ασφαλείς ακμές. Πάντα μία από τις ακμές ελαχίστου κόστους που ενώνει το δένδρο με τον υπόλοιπο γράφο Ο Αλγόριθμος Kruskal διαλέγει πάντα ασφαλείς ακμές. Πάντα μία από τις ακμές ελαχίστου κόστους που ενώνει μέρη του γράφου που δεν είναι συνδεδεμένα Απόδειξη Συντομότερες διαδρομές μιας αφετηρίας Οι αλγόριθμοι Prim και Kruskal παράγουν γεννητικά δένδρα Ο αλγόριθμος Prim παράγει μια βέλτιστη λύση Ας υποθέσουμε ότι υπάρχει ένα ελάχιστο γεννητικό δένδρο Τ που δεν χρησιμοποιεί καμία από τις ακμές ελαχίστου κόστους που ενώνουν μια κοπή S,V-S. Έστω e μια τέτοια ακμή σε κορυφές u,v Οι u και v πρέπει κάπως να ενώνονται στο Τ και σίγουρα χρησιμοποιώντας μία ακμή h που διασχίζει την κοπή we < wh Αν αντικαταστήσουμε την h με την e, θα έχουμε πάλι ένα γεννητικό δένδρο με αυστηρά μικρότερο κόστος Απόδειξη του λήμματος: Επιχείρημα ανταλλαγής Συντομότερες διαδρομές μιας αφετηρίας Έχουμε ένα γράφημα G=(V,E) και μη-αρνητικά βάρη we στις ακμές Δεν παράγουν κύκλους, καλύπτουν ολόκληρο το γράφο Θέλουμε να βρούμε τις διαδρομές ελαχίστου κόστους (συντομότερες) ξεκινώντας από μία κορυφή s ή τη συντομότερη διαδρομή s->f Σε κάθε βήμα ας θεωρήσουμε S το σύνολο κορυφών που έχει βάλει ο αλγόριθμος στη λύση. Η καινούρια ακμή που προστίθεται είναι μία από τις ελαχίστου κόστους. Επαγωγικά, υπάρχει ένα ελάχιστο γεννητικό δένδρο που ταυτίζεται με την έξοδο του αλγορίθμου, Dijkstra Ο αλγόριθμος Kruskal παράγει μια βέλτιστη λύση Σε κάθε βήμα, έστω e=(u,v) η ακμή που προστέθηκε από τον αλγόριθμο. Έστω S το σύνολο των κορυφών που συνδέονται με την u πριν εισάγουμε την e. v S αφού η e δεν δημιουργεί κύκλο. Η e είναι μία από τις ακμές ελαχίστου κόστους που συνδέει το S με το V-S Αλγόριθμος του Dijkstra Διατηρούμε ένα σύνολο T κορυφών που γνωρίζουμε τη συντομότερη διαδρομή Διατηρούμε την τρέχουσα συντομότερη απόσταση από την s προς τις κορυφές του T Προσθέτουμε σε κάθε βήμα στο S, την κορυφή εκτός S που είναι πιο κοντά στο S.. T {s}. d(s)=. While T V..Επέλεξε την ακµή e=(u,v) ώστε u T,v T που έχει το ελάχιστο d(u)+we..d(v)=d(u)+we..pred(v) u..t T {v} Προσθέτουμε στο S
Προσθέτουμε στο S Προσθέτουμε στο S Προσθέτουμε στο S Προσθέτουμε στο S
Προσθέτουμε στο S Προσθέτουμε στο S Προσθέτουμε στο S Προσθέτουμε στο S Προσθέτουμε στο S
Προσθέτουμε στο S Απόδειξη Διαδρομές Προσθέτουμε στο S Επαγωγικά: Υποθέτουμε ότι έχουμε ένα S και όλες οι στο S είναι οι συντομότερες. Εξετάζουμε μια κορυφή v στο V-S με το ελάχιστο d(u)+we όπου e=(u,v). Αυτή η κορυφή έχει την ελάχιστη τιμή (μονοπάτι στο S)+(μία ακμή που πηγαίνει εκτός S), ας πούμε αυτή την τιμή d. Αν υπήρχε άλλη αυστηρά συντομότερη διαδρομή για την v, πρέπει να περνάει από άλλες κορυφές εκτός S. Έστω x η πρώτη κορυφή που συναντάμε εκτός S. Μα η απόσταση μέχρι την x είναι τουλάχιστον d. Και χρειαζόμαστε τουλάχιστον άλλη μία ακμή. Δεν μπορεί να υπάρχει η x άρα έχουμε τη συντομότερη διαδρομή. Όταν προσθέτουμε μια κορυφή στο S έχουμε βρει τη συντομότερη διαδρομή Ο αλγόριθμος βρίσκει ένα δένδρο συντομότερο διαδρομών Απλά ακολουθούμε τις ακμές που χρησιμοποιήσαμε Αν απλά θέλουμε το συντομότερο μονοπάτι από την s στην u, σταματάμε όταν προσθέσουμε την u Ανάλογα με την υλοποίηση μπορούμε να πετύχουμε χρόνο O(n ) ή O(mlogn)