Μας δίνεται ένα δίκτυο (κατευθυνόμενο γράφημα) αφετηριακός κόμβος και Γέφυρα του (με αφετηρία τον ) : Ακμή που περιέχεται σε κάθε μονοπάτι από το στο s a b c d e f g h i j k l
Μας δίνεται ένα δίκτυο (κατευθυνόμενο γράφημα) αφετηριακός κόμβος και Γέφυρα του (με αφετηρία τον ) : Ακμή που περιέχεται σε κάθε μονοπάτι από το στο s a b c d e f g h i j k l
Μας δίνεται ένα δίκτυο (κατευθυνόμενο γράφημα) αφετηριακός κόμβος και Γέφυρα του (με αφετηρία τον ) : Ακμή που περιέχεται σε κάθε μονοπάτι από το στο Ιδιότητα : Έστω ένα οποιοδήποτε συνδετικό δένδρο του με ρίζα τον. Κάθε γέφυρα είναι ακμή του. Μπορούμε να βρούμε όλες τις γέφυρες γρήγορα χρησιμοποιώντας καθοδική διερεύνηση (DFS). = δένδρο καθοδικής διερεύνησης με αφετηρία το
Καθοδική διερεύνηση του με αφετηρία το s a b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h 9 i j k l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h 9 i j k 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c d e f g h 9 i j k 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c g h 9 d e i f j k 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c g h 9 d e i f j k 2 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b c g h 9 d e i f j k 2 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b 3 c g h 9 d e i f j k 2 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b 3 c g h 9 d e i f j k 2 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b 3 c g h 9 d e i f j k 2 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b 3 c g h 9 d e i f j k 2 0 l Γράφημα
Καθοδική διερεύνηση του με αφετηρία το s a 2 3 b 3 c g h 9 d e i f j k 2 0 l Γράφημα
Καθοδική διερεύνηση γραφήματος adj Υλοποίηση με αναδρομή : 2 2 2 3 typedef struct node *link; struct node { int v; link next; } 3 3 3... void DFS(int k) /* ο κόμβος k είναι η αφετηρία */ { link t; visited[k] = ; for (t = adj[k]; t!= NULL; t = t->next) if (!visited[t->v]) DFS(t->v); } Χρόνος εκτέλεσης για γράφημα με κόμβους και ακμές
Ιδέα : Επεξεργαζόμαστε τους κόμβους από τα φύλλα προς τη ρίζα του δένδρου καθοδικής διερεύνησης και βρίσκουμε κύκλους του γραφήματος γονέας του στο Κεφαλίδα (header) κόμβου κοντινότερος πρόγονος του στο τέτοιος ώστε υπάρχει μονοπάτι από τον στον που περιέχει μόνο απογόνους του στο αν δεν υπάρχει τέτοιος πρόγονος
Ιδέα : Επεξεργαζόμαστε τους κόμβους από τα φύλλα προς τη ρίζα του δένδρου καθοδικής διερεύνησης και βρίσκουμε κύκλους του γραφήματος γονέας του στο Κεφαλίδα (header) κόμβου κοντινότερος πρόγονος του στο τέτοιος ώστε υπάρχει μονοπάτι από τον στον που περιέχει μόνο απογόνους του στο αν δεν υπάρχει τέτοιος πρόγονος Δάσος Κεφαλίδων (header forest) Αποτελείται από τις ακμές για
Δάσος κεφαλίδων
γονέας του στο υποδένδρο του δάσους με ρίζα τον Θεώρημα Η ακμή είναι γέφυρα αν και μόνο αν είναι η μοναδική ακμή τέτοια ώστε και
Θεώρημα Η ακμή είναι γέφυρα αν και μόνο αν είναι η μοναδική ακμή τέτοια ώστε και Έστω ότι αριθμούμε κάθε κόμβο σε αντίστροφη σειρά μεταδιάταξης (reverse postorder). 2 Τότε η ακμή είναι γέφυρα αν και μόνο 3 αν δεν υπάρχει ακμή τέτοια 0 ώστε και Πόρισμα 3 2 9 Αν το δάσος κεφαλίδων είναι γνωστό τότε μπορούμε να βρούμε όλες τις γέφυρες σε χρόνο (Πως;)
Υπολογισμός δάσους κεφαλίδων Επεξεργαζόμαστε τους κόμβους από τα φύλλα προς τη ρίζα του δένδρου καθοδικής διερεύνησης. Όταν επεξεργαζόμαστε τον κόμβο βρίσκουμε τους κύκλους του γραφήματος που περιλαμβάνουν τον και μόνο απογόνους του στο. Συρρικνώνουμε κάθε τέτοιο κύκλο στον και θέτουμε για κάθε κόμβο του κύκλου. (Η συρρίκνωση των κόμβων μπορεί να γίνει αποτελεσματικά με μια δομή ένωσηςεύρεσης σε ξένα σύνολα.)
3 2 0 3 9 2 Δάσος κεφαλίδων
3 2 0 3 9 2 Δάσος κεφαλίδων
3 2 0 3 9 2 Δάσος κεφαλίδων
3 2 0 3 9 Δάσος κεφαλίδων
3 2 0 9 Δάσος κεφαλίδων
3 2 0 9 Δάσος κεφαλίδων
3 2 0 9 Δάσος κεφαλίδων
3 2 0 9 Δάσος κεφαλίδων
3 2 0 9 Δάσος κεφαλίδων
3 2 0 9 Δάσος κεφαλίδων
3 2 0 Δάσος κεφαλίδων
3 2 0 Δάσος κεφαλίδων
3 2 0 Δάσος κεφαλίδων
3 2 0 3 9 2 Δάσος κεφαλίδων
Υπολογισμός δάσους κεφαλίδων Για να βρούμε τους κύκλους που περιέχουν μόνο απόγονους του μια αντίστροφη αναζήτηση (π.χ. καθοδική διερεύνηση) με αφετηρία το ακολουθούμε τις ακμές σε αντίστροφή φορά. εκτελούμε, όπου Τι γίνεται όμως με τις ακμές που οδηγούν σε μη απογόνους του ; 0 9
Υπολογισμός δάσους κεφαλίδων Για να βρούμε τους κύκλους που περιέχουν μόνο απόγονους του μια αντίστροφη αναζήτηση (π.χ. καθοδική διερεύνηση) με αφετηρία το ακολουθούμε τις ακμές σε αντίστροφή φορά. εκτελούμε, όπου Τι γίνεται όμως με τις ακμές που οδηγούν σε μη απογόνους του ; Μπορούμε να τις αγνοήσουμε, αλλά ο αλγόριθμος μας θα έχει χρόνο εκτέλεσης για γράφημα με κόμβους και ακμές. (Γιατί;) Καλύτερη λύση : Πραγματοποιούμε τους υπολογισμούς σε ένα βοηθητικό (δυναμικό) γράφημα το οποίο έχει το ίδιο σύνολο κόμβων με το αλλά αρχικά καμία ακμή. Προσθέτουμε τις ακμές στο τη στιγμή που χρειάζονται.
Υπολογισμός δάσους κεφαλίδων Καλύτερη λύση : Πραγματοποιούμε τους υπολογισμούς σε ένα βοηθητικό (δυναμικό) γράφημα το οποίο έχει το ίδιο σύνολο κόμβων με το αλλά αρχικά καμία ακμή. Προσθέτουμε τις ακμές στο τη στιγμή που χρειάζονται. Πριν επεξεργαστούμε τον κόμβο εισάγουμε τις ακμές για τις οποίες 0 κκπ(h,l) = κκπ(h,g) = h 0 9 κκπ(k,h) = κκπ(g,l) = h κκπ(c,g) = κκπ(l,d) = d 9 κκπ(d,h) = κκπ(d,c) = d
Υπολογισμός δάσους κεφαλίδων Καλύτερη λύση : Πραγματοποιούμε τους υπολογισμούς σε ένα βοηθητικό (δυναμικό) γράφημα το οποίο έχει το ίδιο σύνολο κόμβων με το αλλά αρχικά καμία ακμή. Προσθέτουμε τις ακμές στο τη στιγμή που χρειάζονται. Πριν επεξεργαστούμε τον κόμβο εισάγουμε τις ακμές για τις οποίες Ο υπολογισμός των κκπ για όλες τις ακμές γίνεται συνολικά σε χρόνο Ολόκληρος ο αλγόριθμος τρέχει σε χρόνο
Υπολογισμός δάσους κεφαλίδων Εναλλακτικά μπορούμε να υπολογίσουμε το δάσος κεφαλίδων ταυτόχρονα με την καθοδική διερεύνηση. Σε κάθε κόμβο αποθηκεύουμε μια λίστα εισερχόμενων ακμών, αρχικά κενή. για κάθε ακμή αν δεν έχουμε επισκεφτεί τον τότε ενόσω επόμενος κόμβος της αλλιώς εύρεση ενόσω εύρεση ένωση εύρεση