ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΛΑΜΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΧΕΔΙΑΣΜΟΣ ΚΑΙ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2010 11 Ιστοσελίδα μαθήματος: http://eclass.teilam.gr/di288 5ο ΕΡΓΑΣΤΗΡΙΟ 1 Διάσχιση κατευθυνόμενων γραφημάτων Διάσχιση ή διαπέραση ή διάβαση ή εξερεύνηση γραφήματος χαρακτηρίζεται η διαδικασία συστηματικής και εξαντλητικής επίσκεψης όλων των κορυφών ενός γραφήματος χρησιμοποιώντας τους δεσμούς ή τα τόξα του. Υπάρχουν δύο βασικοί τρόποι διάσχισης των γραφημάτων. αναζήτηση σε βάθος(depth first search ή DFS). αναζήτηση κατά πλάτος(breadth first search ή BFS). 1.1 Αναζήτηση σε βάθος σε κατευθυνόμενα γραφήματα Διαισθητικά η βασική ιδέα της αναζήτησης σε βάθος είναι ότι αρχίζουμε από μια κορυφή και προχωράμε από κορυφή σε κορυφή ώστε να απομακρυνόμαστε από την αρχική κορυφή. Ηαναζήτησησεβάθοςενόςκατευθυνόμενουγραφήματος G = (V,U)υλοποιείταιμετηβοήθειαμιας στοίβας S και ενός βοηθητικού πίνακα A. Οπίνακας Aέχειμέγεθοςίσοςμετοναριθμότωνκορυφώντουγραφήματοςκαιστηναρχήόλατα στοιχεία του πίνακα έχουν τιμή 1. Ο πίνακας A χρησιμοποιείται για να σημειώνεται αν μια κορυφή έχει ήδη εξερευνηθεί. Σ αυτή την υλοποίηση κρατάμε επιπλέον την πληροφορία με ποιά σειρά έχουμε επισκεφτεί την αντίστοιχη κορυφή, για το σκοπό αυτό χρησιμοποιούμε την βοηθητική μεταβλητή pre. Στην στοίβα S αποθηκεύονται οι κορυφές που(ενδεχομένως) δεν έχουμε ακόμη επισκεφτεί. Η στοίβα S χρησιμοποιείται έτσι ώστε όταν φτάσουμε σε αδιέξοδο να γυρίζουμε γρήγορα πίσω για να συνεχίσουμε στην επόμενη υποψήφια κορυφή για εξερεύνηση. Παρατήρηση. Υπάρχουν πολλές υλοποιήσεις της αναζήτησης σε βάθος, η διαφορά τους έγκειται στο ποιες ενέργειες πραγματοποιούνται ή ποιες πληροφορίες επεξεργάζονται κατά την επίσκεψη των κορυφών. Ταβήματατουαλγορίθμουαναζήτησηςσεβάθος,ξεκινώνταςαπότηνκορυφή v j,είναιταακόλουθα: 1.Αρχικά,όλεςοικορυφέςτου Gείναιανεξερεύνητες,επομένωςσεόλεςτιςθέσειςτουπίνακα A θέτουμε 1.Επίσηςθέτουμε pre = 0 2.Τοποθετούμετηνκορυφή v j στηνστοίβα S. 3. Οσοηστοίβα Sείναιμηκενήεκτελούμεταακόλουθαβήματα (αʹ)εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,έστωτο v k. (βʹ)αν A[k] 1,δενεκτελούμεκαμιάενέργεια,αφούηκορυφή v k έχειήδηεξερευνηθεί. (γʹ) Αν A[k] = 1,δηλαδήηκορυφή v k είναιανεξερεύνητη,τηνεπισκεπτόμαστε,καιθέτουμε pre = pre+1και A[k] = pre. Επίσης, είτε από τον πίνακα γειτνίασης είτε από την λίστα γειτονικότητας βρίσκουμε όλες τιςκορυφέςστιςοποίεςκαταλήγουντόξαπουαρχίζουναπότην v k,καιτιςτοποθετούμε στη στοίβα. 1
S Παράδειγμα Ηαναζήτησησεβάθοςμεαφετηρίατηνκορυφήv 7 στοκατευθυνόμενογράφημαg = (V,U)μεεκτελείται ως εξής: 1. Αρχικάθέτουμεσεκάθεστοιχείοτουπίνακα Aτηντιμή 1καιηστοίβα Sείναικενή. 2. Τοποθετούμετηνκορυφή v 7 στηστοίβα. Α= [-1, -1, -1, -1, -1, -1, -1, -1] S v 7 Α= [-1, -1, -1, -1, -1, -1, -1, -1] 3. Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 7. Επειδή A[7] = 1επισκεπτόμαστετηνκορυφή v 7,θέτουμε pre = pre+1 = 1,θέτουμε A[7] = pre. Απότην v 7 αρχίζουντόξαπουκαταλήγουνστις v 2 και v 6,επομένωςτοποθετούμεστηστοίβατις v 2 και v 6. v 6 Α= [-1, -1, -1, -1, -1, -1, -1, 1] 4. Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 6. Επειδή A[6] = 1επισκεπτόμαστετηνκορυφή v 6,θέτουμε pre = pre+1 = 2,θέτουμε A[6] = 2. Απότην v 6 αρχίζουντόξαπουκαταλήγουνστις v 1 και v 2,επομένωςτοποθετούμεστηστοίβατις v 1 και v 2. v 2 v 1 Α= [-1, -1, -1, -1, -1, -1, 2, 1] 2
5. Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 2. Επειδή A[2] = 1επισκεπτόμαστετηνκορυφή v 2,θέτουμε pre = pre+1 = 3,θέτουμε A[2] = pre. Απότην v 2 αρχίζουντόξαπουκαταλήγουνστην v 3,επομένωςτοποθετούμεστηστοίβατην v 3. v 3 v 1 Α= [-1, -1, 3, -1, -1, -1, 2, 1] 6. Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 3. Επειδή A[3] = 1επισκεπτόμαστετηνκορυφή v 3,θέτουμε pre = pre+1 = 4,θέτουμε A[3] = pre. Απότην v 3 αρχίζουντόξαπουκαταλήγουνστην v 7,επομένωςτοποθετούμεστηστοίβατην v 7. v 7 v 1 Α= [-1, -1, 3, 4, -1, -1, 2, 1] 7. Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 7. Επειδή A[7] = 1 1δενεκτελούμεκαμιάενεργεια v 1 Α= [-1, -1, 3, 4, -1, -1, 2, 1] 8. Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 1. Επειδή A[1] = 1επισκεπτόμαστετηνκορυφή v 1,θέτουμε pre = pre+1 = 5,θέτουμε A[1] = pre. Απότην v 1 αρχίζουντόξαπουκαταλήγουνστις v 2 και v 5,επομένωςτοποθετούμεστηστοίβατις v 2 και v 5. v 5 v 2 Α= [-1, 5, 3, 4, -1, -1, 2, 1] 3
9. Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 5. Επειδή A[5] = 1επισκεπτόμαστετηνκορυφή v 5,θέτουμε pre = pre+1 = 6,θέτουμε A[5] = pre. Απότην v 5 αρχίζουντόξαπουκαταλήγουνστην v 4,επομένωςτοποθετούμεστηστοίβατην v 4. v 4 v 2 Α= [-1, 5, 3, 4, -1, 6, 2, 1] 10.Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 4. Επειδή A[4] = 1επισκεπτόμαστετηνκορυφή v 4,θέτουμε pre = pre+1 = 7,θέτουμε A[4] = pre. Απότην v 4 αρχίζουντόξαπουκαταλήγουνστην v 0,επομένωςτοποθετούμεστηστοίβατην v 0. v 0 v 2 Α= [-1, 5, 3, 4, 7, 6, 2, 1] 11.Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 0. Επειδή A[0] = 1επισκεπτόμαστετηνκορυφή v 0,θέτουμε pre = pre+1 = 8,θέτουμε A[0] = pre. Απότην v 0 δεναρχίζουντόξα,επομένωςδενκάνουμεάλληενέργεια v 2 Α= [8, 5, 3, 4, 7, 6, 2, 1] 12.Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 2. Επειδή A[2] = 3 1δενεκτελούμεκαμιάενέργεια. Α= [8, 5, 3, 4, 7, 6, 2, 1] 4
S S 13.Επειδήηστοίβαείναιμηκενή,εξάγουμετοκορυφαίοστοιχείοτηςστοίβας,τηνκορυφή v 2. Επειδή A[2] = 3 1δενεκτελούμεκαμιάενέργεια. Α= [8, 5, 3, 4, 7, 6, 2, 1] 14. Επειδή η στοίβα είναι κενή, δεν υπάρχουν άλλες κορυφές προς επίσκεψη και επομένως η αναζήτηση σε βάθος ολοκληρώθηκε. Παρατηρήσεις. Α= [8, 5, 3, 4, 7, 6, 2, 1] 1. Στο προηγούμενο παράδειγμα η σειρά με την οποία επισκεφτήκαμε τις κορυφές του γραφήματος ξεκινώνταςαπότηνκορυφή v 7 είναιαποθηκευμένηστιςθέσειςτουπίνακα A = [8,5,3,4,7,6,2,1]. v 7 v 6 v 2 v 3 v 1 v 5 v 4 v 0 2. Στο προηγούμενο παράδειγμα σε ορισμένες περιπτώσεις εισάγαμε στη στοίβα το ίδιο στοιχείο δύο φορές, ή εισάγαμε ένα στοιχείο το οποίο είχαμε ήδη επισκεφτεί. Υπάρχουν υλοποιήσεις της αναζήτησης σε βάθος που αποφεύγουν αυτές τις επαναλήψεις και φυσικά με αυτή την τροποποίηση η σειρά επίσκεψης των κορυφών αλλάζει, η κεντρική ιδέα όμως της αναζήτησης σε βάθος παραμένει ίδια και στις δύο περιπτώσεις. Στην τροποποίηση αυτή σε κάθε βήμα του αλγορίθμου απαιτείται αναζήτηση στη στοίβα και έλεγχος της αντίστοιχης τιμής του πίνακα. 1.1.1 Δένδρο DFS Εστω G = (V,U)ένακατευθυνόμενογράφημα. Σεκάθεεκτέλεσηαναζήτησηςσεβάθοςμεαφετηρία μιακορυφήτουγραφήματοςgαντιστοιχείένακατευθυνόμενοδιατεταγμένοδένδρο T G,τοοποίοονομάζεται δένδρο DFS. Η ρίζα του δένδρου είναι η κορυφή αφετηρίας, οι υπόλοιπες κορυφές του είναι κορυφές που επισκεπτόμαστε κατά την αναζήτηση σε βάθος. Τα τόξα του δένδρου είναι ένα υποσύνολο των τόξων του γραφήματος.συγκεκριμένα,απότατόξατουγραφήματοςμεαρχήτην v k καιτέλοςτην v l στοδένδρο T G κρατάμε εκείνα για τα οποία ισχύουν τα ακόλουθα: (α)αμέσωςμετάτην v k επισκεπτόμαστετην v l (β)αμέσωςμετάτην v m επισκεπτόμαστετην v l,ηv m δενσυνδέεταιμετην v l καιηv k είναιηπιοκοντινή προηγούμενητης v m πουσυνδέεταιμετην v l Το δένδρο DFS παράγεται ως εξής: 1. Αρχικά θέτουμε ως ρίζα του δένδρου την κορυφή αφετηρίας. 2. Ανμετάτηνκορυφή v i επισκεπτόμαστετηνκορυφή v j καιαπότην v i αρχίζειτόξομετέλοςτην v j τότεθέτουμετην v j τελευταίοπαιδίτης v i,αλλιώςβρίσκουμετονπιοκοντινόπρόγονοτης v i για τονοποιοαρχίζειτόξομετέλοςτης v j καιθέτουμετην v j τελευταίοπαιδίαυτούτουπρογόνου. Συνεχίζουμε με τον ίδιο τρόπο μέχρι να εξαντλήσουμε όλες τις κορυφές που επισκεπτόμαστε. 5
Για παράδειγμα στο γράφημα του προηγούμενου παραδείγματος μεαφετηρίατηνκορυφή v 7 ησειράεπίσκεψηςτωνκορυφώνήτανηεξής: v 7 v 6 v 2 v 3 v 1 v 5 v 4 v 0 επομένως αντιστοιχεί το επόμενο κατευθυνόμενο διατεταγμένο δένδρο. v 7 v 6 v 2 v 1 v 3 v 5 v 4 v 0 Μεβάσητοδένδρο DFSπουπροκύπτειαπότηναναζήτησησεβάθοςμεαφετηρίαμιακορυφή,μπορούμε να κατηγοριοποιήσουμε όλα τα τόξα ενός γραφήματος G σε 4 κατηγορίες: ακμές δένδρου, αν αποτελούν τμήμα του δένδρου DFS. εμπροσθοακμές, αν συνδέουν έναν πρόγονο με έναν απόγονο του δένδρου DFS. DFS οπισθοακμές, αν συνδέουν έναν απόγονο με έναν πρόγονο του δένδρου DFS. διασταυρώσεις, αν συνδέουν κορυφές που δεν είναι η μια πρόγονος ή απόγονος της άλλης. Για παράδειγμα τα τόξα του γραφήματος G του προηγούμενου παραδείγματος κατηγοριοποιούνται ως εξής: εμπροσθοακμή v 7 v 6 οπισθοακμή v 2 v 1 v 3 v 5 διασταύρωση v 4 v 0 Παρατήρηση. Ο εντοπισμός κύκλου σε ένα κατευθυνόμενο γράφημα ανάγεται στην εύρεση μια οπισθοακμής στο αντίστοιχο δένδρο DFS. Στοπροηγούμενοπαράδειγματοτόξο(v 3,v 7 )είναιοπισθοακμή,ηοποίαανήκειστονκύκλοv 7,v 6,v 2,v 3,v 7. 6
Άσκηση Για το επόμενο κατευθυνόμενο γράφημα G v 8 v 9 v 10 v 11 1. Ναγίνειαναζήτησησεβάθοςμεαφετηρίατηνκορυφή v 1 2. Να κατεσκευασθεί το αντίστοιχο δένδρο DFS 3. Ναχαρακτηρισθούνόλατατόξατουγραφήματοςμεβάσητοδένδρο DFS 4. Να εξετασθεί αν το γράφημα περιέχει κύκλους. 1.2 Αναζήτηση κατά πλάτος Η βασική ιδέα της αναζήτησης κατά πλάτος είναι ότι αρχίζουμε από μια κορυφή επισκεπτόμαστε όλες τις γειτονικές κορυφές της αρχικής, επισκεπτόμαστε τους γείτονες των γειτόνων, κ.ο.κ. Η αναζήτηση κατά πλάτος ενός κατευθυνόμενου γραφήματος G = (V, U) υλοποιείται με τη βοήθεια μιας ουράς L και ενός βοηθητικού πίνακα A. Οπίνακας Aέχειμέγεθοςίσοςμετοναριθμότωνκορυφώντουγραφήματοςκαιστηναρχήόλατα στοιχεία του πίνακα έχουν τιμή 1. Ο πίνακας A χρησιμοποιείται για να σημειώνεται αν μια κορυφή έχει ήδη εξερευνηθεί. Σ αυτή την υλοποίηση κρατάμε επιπλέον την πληροφορία με ποιά σειρά έχουμε επισκεφτεί την αντίστοιχη κορυφή, για το σκοπό αυτό χρησιμοποιούμε την βοηθητική μεταβλητή pre. Στην ουρά L αποθηκεύονται οι κορυφές των οποίων δεν έχουμε εξετάσει ακόμα τους γείτονες. Παρατήρηση. Οπως και στην περίπτωση της αναζήτησης σε βάθος, υπάρχουν πολλές υλοποιήσεις της αναζήτησης κατά πλάτος, η διαφορά τους έγκειται στο ποιες ενέργειες πραγματοποιούνται ή ποιες πληροφορίες επεξεργάζονται κατά την επίσκεψη των κορυφών. Ταβήματατουαλγορίθμουαναζήτησηςκατάπλάτος,ξεκινώνταςαπότηνκορυφή v j,είναιταακόλουθα: 1.Αρχικά,όλεςοικορυφέςτου Gείναιανεξερεύνητες,επομένωςσεόλεςτιςθέσειςτουπίνακα A θέτουμε 1.Επίσηςθέτουμε pre = 1 2.Επισκεπτόμαστετηνκορυφή v j,θέτουμε A[j] = preκαιεισάγουμετην v j στηνουρά L. 3. Οσοηουρά Lείναιμηκενήεκτελούμεταακόλουθαβήματα: (αʹ) Επίσης, είτε από τον πίνακα γειτνίασης είτε από την λίστα γειτνίασης βρίσκουμε όλες τις κορυφές στις οποίες καταλήγουν τόξα που αρχίζουν από πρώτο στοιχείο της ουράς L. (βʹ)γιακάθεμιααπότιςγειτονικέςκορυφές,έστωτη v k,ελέγχουμεανείναιεξερευνημένη. Αν A[k] 1, δηλαδή είναι εξερευνημένη, δεν εκτελούμε καμια ενέργεια. Αν A[k] = 1, δηλαδή δεν είναι εξερευνημένη, τότε επισκεπτόμαστε την κορυφή, θέτουμε pre = pre+1,θέτουμε A[k] = pre,καιεισάγουμετην v k στοτέλοςτηςουράς L. (γʹ) Αφαιρούμε το πρώτο στοιχείο της ουράς. 7
L Παράδειγμα Ηαναζήτησηκατάπλάτοςμεαφετηρίατηνκορυφή v 7 στοκατευθυνόμενογράφημα G = (V,U)με εκτελείται ως εξής: 1. Αρχικάθέτουμεσεκάθεστοιχείοτουπίνακα Aτηντιμή 1καιηουρά Lείναικενή.Επίσης pre = 1. Α= [-1, -1, -1, -1, -1, -1, -1, -1] 2. Επίσκεπτόμαστετηνκορυφή v 7,θέτουμε A[7] = 1,εισάγουμετην v 7 στηνουρά. L v 7 Α= [-1, -1, -1, -1, -1, -1, -1, 1] 3. Επειδή η ουρά είναι μη κενή, βρίσκουμε τους γείτονες του πρώτου στοιχείου της ουράς, δηλαδή της κορυφής v 7.Οιγείτονέςτηςείναιοικορυφές v 2 και v 6. Επειδή A[2] = 1,επισκεπτόμαστετηνκορυφή v 2,θέτουμε pre = pre + 1 = 1 + 1 = 2,θέτουμε A[2] = 2καιτοποθετούμετην v 2 στοτέλοςτηςουράς. Επειδή A[6] = 1,επισκεπτόμαστετηνκορυφή v 6,θέτουμε pre = pre + 1 = 2 + 1 = 3,θέτουμε A[6] = 3καιτοποθετούμετην v 6 στοτέλοςτηςουράς. Αφαιρούμετηνκορυφή v 7 απότηνουρά. L v 2 v 6 Α= [-1, -1, 2, -1, -1, -1, 3, 1] 8
4. Επειδή η ουρά είναι μη κενή, βρίσκουμε τους γείτονες του πρώτου στοιχείου της ουράς, δηλαδή της κορυφής v 2.Ογείτονάςτηςείναιηκορυφή v 3. Επειδή A[3] = 1,επισκεπτόμαστετηνκορυφή v 3,θέτουμε pre = pre + 1 = 3 + 1 = 4,θέτουμε A[3] = 4καιτοποθετούμετην v 3 στοτέλοςτηςουράς. Αφαιρούμετηνκορυφή v 2 απότηνουρά. L v 6 v 3 Α= [-1, -1, 2, 4, -1, -1, 3, 1] 5. Επειδή η ουρά είναι μη κενή, βρίσκουμε τους γείτονες του πρώτου στοιχείου της ουράς, δηλαδή της κορυφής v 6.Οιγείτονέςτηςείναιοικορυφές v 1 και v 2. Επειδή A[1] = 1,επισκεπτόμαστετηνκορυφή v 1,θέτουμε pre = pre + 1 = 4 + 1 = 5,θέτουμε A[1] = 5καιτοποθετούμετην v 1 στοτέλοςτηςουράς. Επειδή A[2] = 2 1,δενεκτελούμεκαμίαενέργεια. Αφαιρούμετηνκορυφή v 6 απότηνουρά. L v 3 v 1 Α= [-1, 5, 2, 4, -1, -1, 3, 1] 6. Επειδή η ουρά είναι μη κενή, βρίσκουμε τους γείτονες του πρώτου στοιχείου της ουράς, δηλαδή της κορυφής v 3.Ογείτονάςτηςείναιηκορυφή v 7. Επειδή A[7] = 1 1,δενεκτελούμεκαμίαενέργεια. Αφαιρούμετηνκορυφή v 3 απότηνουρά. L v 1 Α= [-1, 5, 2, 4, -1, -1, 3, 1] 7. Επειδή η ουρά είναι μη κενή, βρίσκουμε τους γείτονες του πρώτου στοιχείου της ουράς, δηλαδή της κορυφής v 1.Ογείτονάςτηςείναιηκορυφή v 5. Επειδή A[5] = 1,επισκεπτόμαστετηνκορυφή v 5,θέτουμε pre = pre + 1 = 5 + 1 = 6,θέτουμε A[5] = 6καιτοποθετούμετην v 5 στοτέλοςτηςουράς. Αφαιρούμετηνκορυφή v 1 απότηνουρά. L v 5 Α= [-1, 5, 2, 4, -1, 6, 3, 1] 9
L L 8. Επειδή η ουρά είναι μη κενή, βρίσκουμε τους γείτονες του πρώτου στοιχείου της ουράς, δηλαδή της κορυφής v 5.Ογείτονάςτηςείναιηκορυφή v 4. Επειδή A[4] = 1,επισκεπτόμαστετηνκορυφή v 4,θέτουμε pre = pre + 1 = 6 + 1 = 7,θέτουμε A[4] = 7καιτοποθετούμετην v 4 στοτέλοςτηςουράς. Αφαιρούμετηνκορυφή v 5 απότηνουρά. L v 4 Α= [-1, 5, 2, 4, 7, 6, 3, 1] 9. Επειδή η ουρά είναι μη κενή, βρίσκουμε τους γείτονες του πρώτου στοιχείου της ουράς, δηλαδή της κορυφής v 4.Ογείτονάςτηςείναιηκορυφή v 0. Επειδή A[0] = 1,επισκεπτόμαστετηνκορυφή v 0,θέτουμε pre = pre + 1 = 7 + 1 = 8,θέτουμε A[0] = 8καιτοποθετούμετην v 0 στοτέλοςτηςουράς. Αφαιρούμετηνκορυφή v 4 απότηνουρά. L v 0 Α= [-1, 5, 2, 4, 7, 6, 3, 1] 10. Επειδή η ουρά είναι μη κενή, βρίσκουμε τους γείτονες του πρώτου στοιχείου της ουράς, δηλαδή της κορυφής v 0.Ηκορυφή v 0 δενέχειγείτονες. Αφαιρούμετηνκορυφή v 0 απότηνουρά. Α= [8, 5, 2, 4, 7, 6, 3, 1] 11. Επειδή η ουρά είναι κενή, δεν υπάρχουν άλλοι ανεξερεύνητη γείτονες προς επίσκεψη και επομένως η αναζήτηση κατά πλάτος ολοκληρώθηκε. Α= [8, 5, 2, 4, 7, 6, 3, 1] Παρατήρηση. Στο προηγούμενο παράδειγμα η σειρά με την οποία επισκεφτήκαμε τις κορυφές του γραφήματοςξεκινώνταςαπότηνκορυφή v 7 είναιαποθηκευμένηστιςθέσειςτουπίνακα A = [8,5,2,4,7,6,3,1] v 7 v 2 v 6 v 3 v 1 v 5 v 4 v 0 10
1.3 Δένδρο BFS Εστω G = (V,U)ένακατευθυνόμενογράφημα.Σεκάθεεκτέλεσηαναζήτησηςκατάβάθοςμεαφετηρία μιακορυφήτουγραφήματοςgαντιστοιχείένακατευθυνόμενοδιατεταγμένοδένδρο T G,τοοποίοονομάζεται δένδρο BFS. Η ρίζα του δένδρου είναι η κορυφή αφετηρίας, οι υπόλοιπες κορυφές του είναι κορυφές που επισκεπτόμαστε κατά την αναζήτηση κατά πλάτος. Τα τόξα του δένδρου είναι ένα υποσύνολο των τόξων του γραφήματος. Συγκεκριμένα, το δένδρο BFS παράγεται ως εξής: 1. Αρχικά θέτουμε ως ρίζα του δένδρου την κορυφή αφετηρίας. 2. Στησυνέχειασεκάθεκορυφήv i θέτουμεωςπαιδιά,μετησειράπουτιςεπισκεπτόμαστε,τιςγειτονικές κορυφέςτης v i οιοποίεςείναιανεξερεύνητες. Για παράδειγμα στο γράφημα του προηγούμενου παραδείγματος μεαφετηρίατηνκορυφή v 7 ησειράεπίσκεψηςτωνκορυφώνήτανηεξής: v 7 v 2 v 6 v 3 v 1 v 5 v 4 v 0 επομένως αντιστοιχεί το επόμενο κατευθυνόμενο διατεταγμένο δένδρο. v 7 v 2 v 6 v 3 v 1 v 5 v 4 v 0 Μεβάσητοδένδρο DFSπουπροκύπτειαπότηναναζήτησησεβάθοςμεαφετηρίαμιακορυφή,μπορούμε να κατηγοριοποιήσουμε όλα τα τόξα ενός γραφήματος G σε 3 κατηγορίες: ακμές δένδρου, αν αποτελούν τμήμα του δένδρου DFS. οπισθοακμές, αν συνδέουν έναν απόγονο με έναν πρόγονο του δένδρου DFS. διασταυρώσεις, αν συνδέουν κορυφές που δεν είναι η μια πρόγονος ή απόγονος της άλλης. Παρατήρηση Σε αντίθεση με την αναζήτηση σε βάθος και το δένδρο DFS, στην αναζήτηση κατά πλάτος και το δένδρο BFS δεν υπάρχουν εμπροσθοακμές διότι στην αναζήτηση κατά βάθος επισκεπτόμαστε όλους τους κόμβους που βρίσκονται απόσταση i από την κορυφή αφετηρίας και μετά επισκεπτόμαστε τους κόμβου που βρίσκονται σε απόσταση μεγαλύτερη του i. 11
Για παράδειγμα τα τόξα του γραφήματος G του προηγούμενου παραδείγματος κατηγοριοποιούνται ως εξής: οπισθοακμή v 7 v 2 v 6 v 3 v 1 v 5 διασταύρωση v 4 v 0 Παρατήρηση. Ο εντοπισμός κύκλου σε ένα κατευθυνόμενο γράφημα ανάγεται στην εύρεση μια οπισθοακμής στο αντίστοιχο δένδρο BFS. Στοπροηγούμενοπαράδειγματοτόξο(v 3,v 7 )είναιοπισθοακμή,ηοποίαανήκειστονκύκλοv 7,v 6,v 2,v 3,v 7. Άσκηση Για το επόμενο κατευθυνόμενο γράφημα G v 8 v 9 v 10 v 11 1. Ναγίνειαναζήτησηκατάπλάτοςμεαφετηρίατηνκορυφή v 1 2. Να κατεσκευασθεί το αντίστοιχο δένδρο BFS 3. Ναχαρακτηρισθούνόλατατόξατουγραφήματοςμεβάσητοδένδρο BFS 4. Να εξετασθεί αν το γράφημα περιέχει κύκλους. 12