Τεχνολογίες Υλοποίησης Αλγορίθµων

Σχετικά έγγραφα
Τεχνολογίες Υλοποίησης Αλγορίθµων

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Ασκηση 1 [ ] Παράδοση : Τετάρτη , 13:00

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Βασικές Έννοιες Δοµών Δεδοµένων

ΕΠΛ 231 Δοµές Δεδοµένων και Αλγόριθµοι 11-1

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Τεχνολογίες Υλοποίησης Αλγορίθµων

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Εισαγωγή στην Επιστήμη των Υπολογιστών

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

Αλγόριθµοι και Πολυπλοκότητα

Γράφηµα (Graph) Εργαστήριο 10. Εισαγωγή

Τεχνολογίες Υλοποίησης Αλγορίθµων

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 3

Τεχνολογίες Υλοποίησης Αλγορίθµων

6η Διάλεξη Διάσχιση Γράφων και Δέντρων

Γράφοι: κατευθυνόμενοι και μη

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Εισαγωγή στην Επιστήμη των Υπολογιστών

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Γραφήματα. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ενότητα 5: Αλγόριθμοι γράφων και δικτύων

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Σχέσεις, Ιδιότητες, Κλειστότητες

Μάθημα 21: Ουρές (Queues)

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

HY150a Φροντιστήριο 3 24/11/2017

Αναζήτηση Κατά Πλάτος

Αλγόριθµοι Τύπου Μείωσης Προβλήµατος

Αλγόριθµοι Γραφηµάτων

Δομές Δεδομένων & Αλγόριθμοι

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 7

Κεφάλαιο 3. Γραφήµατα v1.0 ( ) Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne.

Αλγόριθμοι Γραφημάτων

Διάλεξη 21: Γράφοι II - Τοπολογική Ταξινόμηση

Εισαγωγή στους Αλγορίθμους

Αναζήτηση Κατά Πλάτος

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems

Πανεπιστήμιο Στερεάς Ελλάδας Τμήμα Πληροφορικής Εξάμηνο ΣΤ ΘΕΩΡΙΑ ΓΡΑΦΩΝ

Τεχνολογίες Υλοποίησης Αλγορίθµων

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Στοιχεία Θεωρίας Γραφηµάτων (1)

Τεχνολογίες Υλοποίησης Αλγορίθµων

Μέγιστη ροή. Κατευθυνόμενο γράφημα. Συνάρτηση χωρητικότητας. αφετηρίακός κόμβος. τερματικός κόμβος. Ροή δικτύου. με τις ακόλουθες ιδιότητες

Κατευθυνόµενα γραφήµατα. Στοιχεία Θεωρίας Γραφηµάτων (1) Πολυγραφήµατα (Multigraphs)

Τεχνολογίες Υλοποίησης Αλγορίθµων

Σχεδίαση Αλγορίθμων - Τμήμα Πληροφορικής ΑΠΘ -4ο εξάμηνο 1

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 8

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 2

Πληροφοριακά Συστήματα Διοίκησης (ΜΒΑ) Ενότητα 1: Δικτυωτή Ανάλυση (Θεωρία Γράφων)

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 4

Αναζήτηση Κατά Πλάτος

Αλγόριθµοι και Πολυπλοκότητα

Graph Algorithms. Παρουσίαση στα πλαίσια του μαθήματος «Παράλληλοι Αλγόριθμοι» Καούρη Γεωργία Μήτσου Βασιλική

Κεφάλαιο 3. Γραφήµατα v1.1 ( ) Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne.

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Αλγόριθµοι και Πολυπλοκότητα

Εισαγωγή στους Αλγορίθμους

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Κεφάλαιο 3. Γραφήματα. ver. 21/12/2014. Χρησιμοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne.

Ενότητα 10 Γράφοι (ή Γραφήµατα)

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

Αλγόριθμοι Γραφημάτων

Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

Αναζήτηση Κατά Πλάτος

Περίληψη Φροντιστηρίου. Κατανεμημένα Συστήματα Ι. Το περιβάλλον DAP - Χαρακτηριστικά. Το περιβάλλον DAP Τι είναι.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 4 Σωροί, Γράφοι

Cuckoo Hashing. Αλγόριθμοι και Πολυπλοκότητα. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Διάλεξη 18: Γράφοι I - Εισαγωγή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Αντισταθμιστική ανάλυση

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 5

Οντοκεντρικός Προγραμματισμός

Εισαγωγή στους Αλγορίθμους Ενότητα 7η

Αλγόριθμοι Eλάχιστα μονοπάτια

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Πίνακες (Arrays) Εισαγωγή στη C++

Διδάσκων: Παναγιώτης Ανδρέου

ΑΛΓΟΡΙΘΜΟΙ Άνοιξη I. ΜΗΛΗΣ

Κεφάλαιο 4 Γραφήματα και Δένδρα

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Φροντιςτήριο. Linked-List

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

Γράφοι. Αλγόριθμοι και πολυπλοκότητα. Στάθης Ζάχος, Δημήτρης Φωτάκης

Διάλεξη 29: Γράφοι. Διδάσκων: Παναγιώτης Ανδρέου

Transcript:

Τεχνολογίες Υλοποίησης Αλγορίθµων Χρήστος Ζαρολιάγκης Καθηγητής Τµήµα Μηχ/κων Η/Υ & Πληροφορικής Πανεπιστήµιο Πατρών email: zaro@ceid.upatras.gr Ενότητα 5 / 46

Ενότητα 5 Γραφήµατα Γραφήµατα ϐασικές έννοιες Αναπαράσταση Γραφηµάτων Αναπαράσταση ικτύων Γραφήµατα στην LEDA Βασικοί Αλγόριθµοι Γραφηµάτων / 46

Γραφήµατα ϐασικές έννοιες Γράφηµα G = (V, E): σύνολο κόµβων/κορυφών (nodes/vertices) V σύνολο πλευρών/ακµών (edges/arcs) E V V σχέσεις µεταξύ κόµβων 3 4 5 3 4 5 3 / 46

Γραφήµατα ϐασικές έννοιες Γράφηµα G = (V, E): σύνολο κόµβων/κορυφών (nodes/vertices) V σύνολο πλευρών/ακµών (edges/arcs) E V V σχέσεις µεταξύ κόµβων Μια ακµή e = (i, j) E «συσχετίζει» ή «συνδέει» τις κορυφές i και j 3 4 5 3 4 5 3 / 46

Γραφήµατα ϐασικές έννοιες 3 4 5 3 4 5 Κατευθυνόµενες ακµές κατευθυνόµενο γράφηµα Μη-κατευθυνόµενες ακµές µη κατευθυνόµενο γράφηµα 4 / 46

Γραφήµατα ϐασικές έννοιες 3 4 5 3 4 5 Κατευθυνόµενες ακµές κατευθυνόµενο γράφηµα Μη-κατευθυνόµενες ακµές µη κατευθυνόµενο γράφηµα Κατευθυνόµενη ακµή e = (i, j) i: αρχική κορυφή (source/tail) j: τελική κορυφή (target/head) 4 / 46

Γραφήµατα ϐασικές έννοιες 3 4 5 3 4 5 Κατευθυνόµενες ακµές κατευθυνόµενο γράφηµα Μη-κατευθυνόµενες ακµές µη κατευθυνόµενο γράφηµα Κατευθυνόµενη ακµή e = (i, j) i: αρχική κορυφή (source/tail) j: τελική κορυφή (target/head) Ακµή e = (i, j) E Η i είναι γειτονική (adjacent) της j Η e προσπίπτει (incident) στις i και j 4 / 46

Γραφήµατα ϐασικές έννοιες 3 Συµβολισµός n = V, m = E 4 5 3 4 5 5 / 46

Γραφήµατα ϐασικές έννοιες 3 Συµβολισµός n = V, m = E 4 5 3 4 5 Μη κατευθυνόµενα γραφήµατα, βαθµός (degree) κορυφής i: d i = # προσπιπτουσών ακµών της κορυφής i 5 / 46

Γραφήµατα ϐασικές έννοιες 3 Συµβολισµός n = V, m = E 4 5 3 4 5 Μη κατευθυνόµενα γραφήµατα, βαθµός (degree) κορυφής i: d i = # προσπιπτουσών ακµών της κορυφής i Κατευθυνόµενα γραφήµατα βαθµός-εισόδου (in-degree) κορυφής i: = # προσπιπτουσών ακµών που έχουν την i ως τελική d in i βαθµός-εξόδου (out-degree) κορυφής i: = # προσπιπτουσών ακµών που έχουν την i ως αρχική d out i 5 / 46

Γραφήµατα ϐασικές έννοιες 3 Συµβολισµός n = V, m = E 4 5 3 4 5 Μη κατευθυνόµενα γραφήµατα, βαθµός (degree) κορυφής i: d i = # προσπιπτουσών ακµών της κορυφής i Κατευθυνόµενα γραφήµατα βαθµός-εισόδου (in-degree) κορυφής i: = # προσπιπτουσών ακµών που έχουν την i ως τελική d in i βαθµός-εξόδου (out-degree) κορυφής i: = # προσπιπτουσών ακµών που έχουν την i ως αρχική d out i Θεώρηµα Euler (ι) n i= d i = m (ιι) n i= din i = n i= dout i = m 5 / 46

Γραφήµατα Αναπαράσταση Μητρώο Γειτνίασης (adjacency matrix) Λίστες Γειτνίασης (adjacency lists) Με χρήση πινάκων (Packed-Adjacency Lists) Με χρήση γραµµικών λιστών (Linked-Adjacency Lists) Εµµεση αναπαράσταση (LEDA) 6 / 46

Γραφήµατα Αναπαράσταση Μητρώου Γειτνίασης 3 4 5 3 4 5 Μητρώο A διαστάσεων n n: { αν (i, j) E A(i, j) = 0 αλλιώς 3 4 5 0 0 0 0 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 0 0 0 7 / 46

Γραφήµατα Αναπαράσταση Μητρώου Γειτνίασης 3 4 5 3 4 5 Μητρώο A διαστάσεων n n: { αν (i, j) E A(i, j) = 0 αλλιώς 3 4 5 0 0 0 0 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 0 0 0 Χώρος: O(n ) bytes ή bits 7 / 46

Γραφήµατα Αναπαράσταση Μητρώου Γειτνίασης 3 4 5 3 4 5 Μητρώο A διαστάσεων n n: { αν (i, j) E A(i, j) = 0 αλλιώς 3 4 5 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Χώρος: O(n ) bytes ή bits Χρόνος προσδιορισµού ϐαθµού κορυφής: Θ(n) 7 / 46

Γραφήµατα Αναπαράσταση Μητρώου Γειτνίασης 3 4 5 3 4 5 Μητρώο A διαστάσεων n n: { αν (i, j) E A(i, j) = 0 αλλιώς 3 4 5 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5 0 0 0 0 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Χώρος: O(n ) bytes ή bits Χρόνος προσδιορισµού ϐαθµού κορυφής: Θ(n) Χρόνος εισαγωγής/διαγραφής ακµής: O() 7 / 46

Γραφήµατα Αναπαράσταση µε χρήση πινάκων h[] h[] h[3] h[4] h[5] h[6] l 4 5 3 5 4 3 3 4 5 3 4 5 l h[] h[] h[3] h[4] h[5] h[6] 3 4 5 3 4 Μονοδιάστατοι πίνακες h[..n + ] και l[0..m], όπου M = m (M = m ) αν G είναι κατευθυνόµενο (µη κατευθυνόµενο) 8 / 46

Γραφήµατα Αναπαράσταση µε χρήση πινάκων h[] h[] h[3] h[4] h[5] h[6] l 4 5 3 5 4 3 3 4 5 3 4 5 l h[] h[] h[3] h[4] h[5] h[6] 3 4 5 3 4 Μονοδιάστατοι πίνακες h[..n + ] και l[0..m], όπου M = m (M = m ) αν G είναι κατευθυνόµενο (µη κατευθυνόµενο) Οργάνωση πίνακα l[0..m]: οι πρώτες d (d out ) ϑέσεις περιέχουν όλες τις κορυφές που είναι (εξερχόµενες) γειτονικές στην κορυφή, οι επόµενες d (d out ) ϑέσεις περιέχουν όλες τις κορυφές που είναι (εξερχόµενες) γειτονικές στην κορυφή, κοκ 8 / 46

Γραφήµατα Αναπαράσταση µε χρήση πινάκων h[] h[] h[3] h[4] h[5] h[6] l 4 5 3 5 4 3 3 4 5 3 4 5 l h[] h[] h[3] h[4] h[5] h[6] 3 4 5 3 4 Μονοδιάστατοι πίνακες h[..n + ] και l[0..m], όπου M = m (M = m ) αν G είναι κατευθυνόµενο (µη κατευθυνόµενο) Οργάνωση πίνακα l[0..m]: οι πρώτες d (d out ) ϑέσεις περιέχουν όλες τις κορυφές που είναι (εξερχόµενες) γειτονικές στην κορυφή, οι επόµενες d (d out ) ϑέσεις περιέχουν όλες τις κορυφές που είναι (εξερχόµενες) γειτονικές στην κορυφή, κοκ Οργάνωση πίνακα h[..n + ]: οι γειτονικές κορυφές της κορυφής i ϐρίσκονται στις ϑέσεις l[h[i]], l[h[i] + ],..., l[h[i + ] ], όπου h[i] < h[i + ] 8 / 46

Γραφήµατα Αναπαράσταση µε χρήση πινάκων h[] h[] h[3] h[4] h[5] h[6] l 4 5 3 5 4 3 3 4 5 3 4 5 l h[] h[] h[3] h[4] h[5] h[6] 3 4 5 3 4 Χώρος: (n + ) log(m + ) + m log n = O((n + m) log n) bits = O(n + m) bytes 9 / 46

Γραφήµατα Αναπαράσταση µε χρήση πινάκων h[] h[] h[3] h[4] h[5] h[6] l 4 5 3 5 4 3 3 4 5 3 4 5 l h[] h[] h[3] h[4] h[5] h[6] 3 4 5 3 4 Χώρος: (n + ) log(m + ) + m log n = O((n + m) log n) bits = O(n + m) bytes Χρόνος προσδιορισµού ϐαθµού κορυφής: O() 9 / 46

Γραφήµατα Αναπαράσταση µε χρήση πινάκων h[] h[] h[3] h[4] h[5] h[6] l 4 5 3 5 4 3 3 4 5 3 4 5 l h[] h[] h[3] h[4] h[5] h[6] 3 4 5 3 4 Χώρος: (n + ) log(m + ) + m log n = O((n + m) log n) bits = O(n + m) bytes Χρόνος προσδιορισµού ϐαθµού κορυφής: O() Χρόνος εισαγωγής/διαγραφής ακµής: O(n + m) 9 / 46

Γραφήµατα Αναπαράσταση µε χρήση γραµµικών λιστών 0 / 46

Γραφήµατα Αναπαράσταση µε χρήση γραµµικών λιστών Κάθε σύνολο γειτονικών κορυφών γραµµική λίστα 0 / 46

Γραφήµατα Αναπαράσταση µε χρήση γραµµικών λιστών Κάθε σύνολο γειτονικών κορυφών γραµµική λίστα Κορυφή i αποθηκεύεται στη ϑέση h[i] ενός πίνακα h h[i] γραµµική λίστα κορυφής i 0 / 46

Γραφήµατα Αναπαράσταση µε χρήση γραµµικών λιστών 3 4 5 3 4 5 3 4 5 3 5 4 0 0 0 0 0 0 0 0 0 0 4 3 4 4 4 3 3 3 5 5 5 Χώρος: (n + )sizeof(pointer) + m log n = O((n + m) log n) bits = O(n + m) bytes / 46

Γραφήµατα Αναπαράσταση µε χρήση γραµµικών λιστών 3 4 5 3 4 5 3 4 5 3 5 4 0 0 0 0 0 0 0 0 0 0 4 3 4 4 4 3 3 3 5 5 5 Χώρος: (n + )sizeof(pointer) + m log n = O((n + m) log n) bits = O(n + m) bytes Χρόνος προσδιορισµού ϐαθµού κορυφής: O(d out i ) / 46

Γραφήµατα Αναπαράσταση µε χρήση γραµµικών λιστών 3 4 5 3 4 5 3 4 5 3 5 4 0 0 0 0 0 0 0 0 0 0 4 3 4 4 4 3 3 3 5 5 5 Χώρος: (n + )sizeof(pointer) + m log n = O((n + m) log n) bits = O(n + m) bytes Χρόνος προσδιορισµού ϐαθµού κορυφής: O(d out i ) Χρόνος εισαγωγής/διαγραφής ακµής: O() / O(d out i ) / 46

Αναπαράσταση ικτύων / 46

Αναπαράσταση ικτύων ίκτυο: γράφηµα του οποίου οι κορυφές/ακµές συσχετίζονται µε κάποια τιµή / 46

Αναπαράσταση ικτύων ίκτυο: γράφηµα του οποίου οι κορυφές/ακµές συσχετίζονται µε κάποια τιµή Μητρώο Γειτνίασης: πιο γενικό µητρώο W, τέτοιο ώστε { weight(i, j) αν (i, j) E W(i, j) = NoEdge αλλιώς όπου NoEdge ισούται µε κάποια προεπιλεγµένη τιµή (π.χ. 0 ή ) / 46

Αναπαράσταση ικτύων ίκτυο: γράφηµα του οποίου οι κορυφές/ακµές συσχετίζονται µε κάποια τιµή Μητρώο Γειτνίασης: πιο γενικό µητρώο W, τέτοιο ώστε { weight(i, j) αν (i, j) E W(i, j) = NoEdge αλλιώς όπου NoEdge ισούται µε κάποια προεπιλεγµένη τιµή (π.χ. 0 ή ) Λίστες Γειτνίασης - χρήση πινάκων: κάθε στοιχείο του πίνακα l περιέχει ένα Ϲεύγος (κορυφή, τιµή) / 46

Αναπαράσταση ικτύων ίκτυο: γράφηµα του οποίου οι κορυφές/ακµές συσχετίζονται µε κάποια τιµή Μητρώο Γειτνίασης: πιο γενικό µητρώο W, τέτοιο ώστε { weight(i, j) αν (i, j) E W(i, j) = NoEdge αλλιώς όπου NoEdge ισούται µε κάποια προεπιλεγµένη τιµή (π.χ. 0 ή ) Λίστες Γειτνίασης - χρήση πινάκων: κάθε στοιχείο του πίνακα l περιέχει ένα Ϲεύγος (κορυφή, τιµή) Λίστες Γειτνίασης - χρήση γραµµικών λιστών: κάθε στοιχείο µιας λίστας περιέχει ένα επιπρόσθετο πεδίο το οποίο αποθηκεύει την τιµή της ακµής / 46

Γραφήµατα στην LEDA 3 / 46

Γραφήµατα στην LEDA Κατευθυνόµενα γραφήµατα: graph, GRAPH<vtype,etype> 3 / 46

Γραφήµατα στην LEDA Κατευθυνόµενα γραφήµατα: graph, GRAPH<vtype,etype> Μη κατευθυνόµενα γραφήµατα: ugraph, UGRAPH<vtype,etype> 3 / 46

Γραφήµατα στην LEDA Κατευθυνόµενα γραφήµατα: graph, GRAPH<vtype,etype> Μη κατευθυνόµενα γραφήµατα: ugraph, UGRAPH<vtype,etype> Υλοποίηση των τύπων γραφηµάτων στην LEDA: αναπαράσταση λιστών γειτνίασης µε χρήση γραµµικών λιστών (χρησιµοποιούνται διπλά διασυνδεδεµένες λίστες κορυφών και ακµών) 3 / 46

Γραφήµατα στην LEDA Κατευθυνόµενα γραφήµατα: graph, GRAPH<vtype,etype> Μη κατευθυνόµενα γραφήµατα: ugraph, UGRAPH<vtype,etype> Υλοποίηση των τύπων γραφηµάτων στην LEDA: αναπαράσταση λιστών γειτνίασης µε χρήση γραµµικών λιστών (χρησιµοποιούνται διπλά διασυνδεδεµένες λίστες κορυφών και ακµών) Απαιτήσεις χώρου για τον τύπο graph: O() + 44m + 5n bytes 3 / 46

Γραφήµατα στην LEDA Κατευθυνόµενα γραφήµατα: graph, GRAPH<vtype,etype> Μη κατευθυνόµενα γραφήµατα: ugraph, UGRAPH<vtype,etype> Υλοποίηση των τύπων γραφηµάτων στην LEDA: αναπαράσταση λιστών γειτνίασης µε χρήση γραµµικών λιστών (χρησιµοποιούνται διπλά διασυνδεδεµένες λίστες κορυφών και ακµών) Απαιτήσεις χώρου για τον τύπο graph: O() + 44m + 5n bytes Απαιτήσεις χώρου για τον τύπο GRAPH<T,T>: O() + 44m + 5n + sizeof(t)n + sizeof(t)m bytes 3 / 46

Γραφήµατα στην LEDA Ορισµός γραφηµάτων, κορυφών και ακµών graph G; node v,w; edge e,f; // G is initialized to the empty graph // initial values are unspecified for // nodes and edges, however... node u=nil; // we can initialize a node or edge to the // special value nil. // nil is not a node or edge of any graph. 4 / 46

Γραφήµατα στην LEDA 5 / 46

Γραφήµατα στην LEDA Επαναλήπτες Γραφηµάτων forall_nodes(v,g) { } forall_edges(e,g) { } // iterates over all edges e out of v, // i.e., source(e)=v forall_out_edges(e,v) { } forall_adj_edges(e,v) { } // iterates over all nodes of G // iterates over all edges of G // iterates over all edges e incident to v, // i.e., target(e)=v forall_in_edges(e,v) { } // iterates over all edges e incident to and from v forall_inout_edges(e,v) { } 5 / 46

Γραφήµατα στην LEDA Επαναλήπτες Γραφηµάτων forall_nodes(v,g) { } forall_edges(e,g) { } // iterates over all edges e out of v, // i.e., source(e)=v forall_out_edges(e,v) { } forall_adj_edges(e,v) { } // iterates over all nodes of G // iterates over all edges of G // iterates over all edges e incident to v, // i.e., target(e)=v forall_in_edges(e,v) { } // iterates over all edges e incident to and from v forall_inout_edges(e,v) { } επίσης κλάσεις τύπου Iterator, µε χρήση του γνωστού σχεδιαστικού προτύπου Iterator δείτε το εγχειρίδιο της LEDA 5 / 46

Γραφήµατα στην LEDA Χρήση Επαναληπτών int m = 0; forall_edges(e,g) m++; // counts the number of edges in G // this number is also available as // G.number_of_edges() 6 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών και Ακµών (Node and Edge arrays) 7 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών και Ακµών (Node and Edge arrays) Επιτρέπουν την συσχέτιση πληροφορίας (π.χ. κόστος, id) µε κορυφές και ακµές 7 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών και Ακµών (Node and Edge arrays) Επιτρέπουν την συσχέτιση πληροφορίας (π.χ. κόστος, id) µε κορυφές και ακµές // Name is indexed by the nodes of G; each entry // of Name is initialized to the empty string. node_array<string> Name(G); // Length is indexed by the edges of G; each entry // of Length is initialized with the value. edge_array<int> Length(G,); //... Name[v] = "Patra"; Length[e] = 37; 7 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Παράδειγµα: ανάθεση αριθµών από 0 µέχρι n στις κορυφές του G 8 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Παράδειγµα: ανάθεση αριθµών από 0 µέχρι n στις κορυφές του G node_array<int> Number(G); int count = 0; forall_nodes(v,g) Number[v] = count++; 8 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Παραµετρικά Γραφήµατα 9 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Παραµετρικά Γραφήµατα Εναλλακτική µέθοδος στους πίνακες κορυφών και ακµών 9 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Παραµετρικά Γραφήµατα Εναλλακτική µέθοδος στους πίνακες κορυφών και ακµών GRAPH<string,int> H; H[v] = "Patra"; H[e] = 37; // v must be a node of H // e must be an edge of H 9 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών/Ακµών και Παραµετρικά Γραφήµατα 0 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών/Ακµών και Παραµετρικά Γραφήµατα Οι πίνακες κορυφών και ακµών χρησιµοποιούνται µόνο για στατικά γραφήµατα, δηλ. µία νέα κορυφή (ακµή) δεν ϑα έχει ένα αντίστοιχο στοιχείο στον πίνακα κορυφών (ακµών) 0 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών/Ακµών και Παραµετρικά Γραφήµατα Οι πίνακες κορυφών και ακµών χρησιµοποιούνται µόνο για στατικά γραφήµατα, δηλ. µία νέα κορυφή (ακµή) δεν ϑα έχει ένα αντίστοιχο στοιχείο στον πίνακα κορυφών (ακµών) Τα παραµετρικά γραφήµατα είναι πλήρως δυναµικά 0 / 46

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών/Ακµών και Παραµετρικά Γραφήµατα Οι πίνακες κορυφών και ακµών χρησιµοποιούνται µόνο για στατικά γραφήµατα, δηλ. µία νέα κορυφή (ακµή) δεν ϑα έχει ένα αντίστοιχο στοιχείο στον πίνακα κορυφών (ακµών) Τα παραµετρικά γραφήµατα είναι πλήρως δυναµικά Ενας οποιοσδήποτε αριθµός πινάκων κορυφών και ακµών µπορούν να ορισθούν για ένα γράφηµα 0 / 46

Γραφήµατα στην LEDA ηµιουργία / 46

Γραφήµατα στην LEDA ηµιουργία Γράφηµα µε δύο κορυφές και καθόλου ακµές / 46

Γραφήµατα στην LEDA ηµιουργία Γράφηµα µε δύο κορυφές και καθόλου ακµές graph G; G.new_node(); G.new_node(); node v; forall_nodes(v,g) //... do something / 46

Γραφήµατα στην LEDA ηµιουργία / 46

Γραφήµατα στην LEDA ηµιουργία ηµιουργία ακµής απαιτεί προσδιορισµό αρχικής και τελικής κορυφής node w = G.first_node(); G.new_edge(w, G.succ_node(w)); / 46

Γραφήµατα στην LEDA ηµιουργία ηµιουργία ακµής απαιτεί προσδιορισµό αρχικής και τελικής κορυφής node w = G.first_node(); G.new_edge(w, G.succ_node(w)); Παρατήρηση: Η LEDA διατάσσει εσωτερικά τις κορυφές (ακµές) ενός γραφήµατος G σύµφωνα µε την σειρά που αυτές προστέθηκαν στο G. / 46

Γραφήµατα στην LEDA ηµιουργία Ενας καλύτερος τρόπος δηµιουργίας ακµών 3 / 46

Γραφήµατα στην LEDA ηµιουργία Ενας καλύτερος τρόπος δηµιουργίας ακµών Η µέθοδος G.new_node() όχι µόνο προσθέτει µια νέα κορυφή στο G, αλλά και την επιστρέφει // creation of our example digraph graph G; node v = G.new_node(); node v = G.new_node(); node v3 = G.new_node(); node v4 = G.new_node(); node v5 = G.new_node(); G.new_edge(v,v); G.new_edge(v,v3); G.new_edge(v3,v4); G.new_edge(v4,v3); G.new_edge(v3,v5); G.new_edge(v5,v4); 3 4 5 3 4 5 3 / 46

Γραφήµατα στην LEDA ηµιουργία Ενας καλύτερος τρόπος δηµιουργίας ακµών Η µέθοδος G.new_node() όχι µόνο προσθέτει µια νέα κορυφή στο G, αλλά και την επιστρέφει // creation of our example digraph graph G; node v = G.new_node(); node v = G.new_node(); node v3 = G.new_node(); node v4 = G.new_node(); node v5 = G.new_node(); G.new_edge(v,v); G.new_edge(v,v3); G.new_edge(v3,v4); G.new_edge(v4,v3); G.new_edge(v3,v5); G.new_edge(v5,v4); Αποθήκευση γραφήµατος σε αρχείο G.write("graph.gw"); 3 4 5 3 4 5 3 / 46

Γραφήµατα στην LEDA ηµιουργία Ενας καλύτερος τρόπος δηµιουργίας ακµών 4 / 46

Γραφήµατα στην LEDA ηµιουργία Ενας καλύτερος τρόπος δηµιουργίας ακµών Αν το G είναι παραµετρικό, τότε µπορούµε να συσχετίσουµε πληροφορία µε τις κορυφές και τις ακµές κατά τη διάρκεια της δηµιουργίας του 3 // creation of our example digraph // with info on nodes and edges 4 5 3 4 5 GRAPH<int,int> G; node v = G.new_node(); node v = G.new_node(); node v3 = G.new_node(3); node v4 = G.new_node(4); node v5 = G.new_node(5); G.new_edge(v,v,0); G.new_edge(v,v3,5); G.new_edge(v3,v4,5); G.new_edge(v4,v3,7); G.new_edge(v3,v5,0); G.new_edge(v5,v4,37); 4 / 46

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου 5 / 46

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου ηµιουργία ενός ισοµορφικού αντιγράφου H ενός γραφήµατος G, έτσι ώστε κάθε κορυφή και ακµή του H να γνωρίζει την αυθεντική της στο G 5 / 46

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου v copy_in_h[v] w G H[w] H 6 / 46

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου v copy_in_h[v] w G H[w] H Χρήση παραµετρικού γραφήµατος για το H και πίνακα κορυφών για το G 6 / 46

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου v copy_in_h[v] w G H[w] H Χρήση παραµετρικού γραφήµατος για το H και πίνακα κορυφών για το G v G : H[copy_in_H[v]]=v w H : copy_in_h[h[w]]=w 6 / 46

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου #include <iostream> #include <LEDA/graph.h> void CopyGraph(GRAPH<node,edge>& H, const graph& G) { node v; edge e; H.clear(); // reset H to the empty graph node_array<node> copy_in_h(g); // associates nodes of G with // their copies in H forall_nodes(v,g) copy_in_h[v] = H.new_node(v); forall_edges(e,g) H.new_edge(copy_in_H[source(e)],copy_in_H[target(e)],e); } 7 / 46

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου int main() { graph G; G.read("graph.gw"); GRAPH<node,edge> H; } CopyGraph(H,G); cout << endl; cout << "n_g = " << G.number_of_nodes() << endl; cout << "n_h = " << H.number_of_nodes() << endl; cout << "m_g = " << G.number_of_edges() << endl; cout << "m_g = " << H.number_of_edges() << endl; return 0; 8 / 46

Γραφήµατα στην LEDA Πίνακες Κορυφών/Ακµών 9 / 46

Γραφήµατα στην LEDA Πίνακες Κορυφών/Ακµών Υλοποιούνται µε τους συνήθεις πίνακες χρόνος αρχικοποίησης # κορυφών/ακµών 9 / 46

Γραφήµατα στην LEDA Πίνακες Κορυφών/Ακµών Υλοποιούνται µε τους συνήθεις πίνακες χρόνος αρχικοποίησης # κορυφών/ακµών Κορυφές/Ακµές ενός γραφήµατος αριθµούνται σύµφωνα µε τη σειρά δηµιουργίας τους, αρχίζοντας από το 0 [αριθµός = index] 9 / 46

Γραφήµατα στην LEDA Πίνακες Κορυφών/Ακµών Υλοποιούνται µε τους συνήθεις πίνακες χρόνος αρχικοποίησης # κορυφών/ακµών Κορυφές/Ακµές ενός γραφήµατος αριθµούνται σύµφωνα µε τη σειρά δηµιουργίας τους, αρχίζοντας από το 0 [αριθµός = index] Η αρίθµηση µιας κορυφής (ακµής) v (e) είναι διαθέσιµη ως index(v) (index(e)) 9 / 46

Γραφήµατα στην LEDA Πίνακες Κορυφών/Ακµών Υλοποιούνται µε τους συνήθεις πίνακες χρόνος αρχικοποίησης # κορυφών/ακµών Κορυφές/Ακµές ενός γραφήµατος αριθµούνται σύµφωνα µε τη σειρά δηµιουργίας τους, αρχίζοντας από το 0 [αριθµός = index] Η αρίθµηση µιας κορυφής (ακµής) v (e) είναι διαθέσιµη ως index(v) (index(e)) Προσπέλαση στοιχείου A[v] = Προσπέλαση της δοµής αναπαράστασης της κορυφής v για τον προσδιορισµό του index(v) Προσπέλαση του στοιχείου A[index(v)] 9 / 46

Γραφήµατα στην LEDA Node/Edge maps 30 / 46

Γραφήµατα στην LEDA Node/Edge maps Παρόµοια µε node/edge arrays 30 / 46

Γραφήµατα στην LEDA Node/Edge maps Παρόµοια µε node/edge arrays Υλοποιούνται µε χρήση κατακερµατισµού 30 / 46

Γραφήµατα στην LEDA Node/Edge maps Παρόµοια µε node/edge arrays Υλοποιούνται µε χρήση κατακερµατισµού Αρχικοποίηση σε O() χρόνο 30 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος 3 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος void dfs(node s, node_array<bool>& reached, list<node>& L) { L.append(s); reached[s] = true; node v; forall_adj_nodes(v,s) if (!reached[v] ) dfs(v,reached,l); } list<node> DFS(node v, node_array<bool>& reached) { list<node> L; dfs(v,reached,l); return L; } 3 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος Κατηγοριοποίηση ακµών 33 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος Κατηγοριοποίηση ακµών ιατήρηση δύο αριθµών για κάθε κορυφή v: dfsnum[v]: χρόνος (πρώτης) ανακάλυψης compnum[v]: χρόνος εγκατάλειψης 33 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος Κατηγοριοποίηση ακµών ιατήρηση δύο αριθµών για κάθε κορυφή v: dfsnum[v]: χρόνος (πρώτης) ανακάλυψης compnum[v]: χρόνος εγκατάλειψης e = (v, w): καλείται ακµή δένδρου αν η dfs(w,...) καλείται όταν η e εξετάζεται στην dfs(v,...) 33 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος Κατηγοριοποίηση ακµών ιατήρηση δύο αριθµών για κάθε κορυφή v: dfsnum[v]: χρόνος (πρώτης) ανακάλυψης compnum[v]: χρόνος εγκατάλειψης e = (v, w): καλείται ακµή δένδρου αν η dfs(w,...) καλείται όταν η e εξετάζεται στην dfs(v,...) Μια ακµή (v, w) είναι 33 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος Κατηγοριοποίηση ακµών ιατήρηση δύο αριθµών για κάθε κορυφή v: dfsnum[v]: χρόνος (πρώτης) ανακάλυψης compnum[v]: χρόνος εγκατάλειψης e = (v, w): καλείται ακµή δένδρου αν η dfs(w,...) καλείται όταν η e εξετάζεται στην dfs(v,...) Μια ακµή (v, w) είναι ακµή δένδρου ή εµπρός ακµή ανν dfsnum[v] < dfsnum[w] και compnum[v] > compnum[w] 33 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος Κατηγοριοποίηση ακµών ιατήρηση δύο αριθµών για κάθε κορυφή v: dfsnum[v]: χρόνος (πρώτης) ανακάλυψης compnum[v]: χρόνος εγκατάλειψης e = (v, w): καλείται ακµή δένδρου αν η dfs(w,...) καλείται όταν η e εξετάζεται στην dfs(v,...) Μια ακµή (v, w) είναι ακµή δένδρου ή εµπρός ακµή ανν dfsnum[v] < dfsnum[w] και compnum[v] > compnum[w] πίσω ακµή ανν dfsnum[v] > dfsnum[w] και compnum[v] < compnum[w] 33 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος Κατηγοριοποίηση ακµών ιατήρηση δύο αριθµών για κάθε κορυφή v: dfsnum[v]: χρόνος (πρώτης) ανακάλυψης compnum[v]: χρόνος εγκατάλειψης e = (v, w): καλείται ακµή δένδρου αν η dfs(w,...) καλείται όταν η e εξετάζεται στην dfs(v,...) Μια ακµή (v, w) είναι ακµή δένδρου ή εµπρός ακµή ανν dfsnum[v] < dfsnum[w] και compnum[v] > compnum[w] πίσω ακµή ανν dfsnum[v] > dfsnum[w] και compnum[v] < compnum[w] διασυνδετική ακµή ανν dfsnum[v] > dfsnum[w] και compnum[v] > compnum[w] 33 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος list<edge> DFS_NUM(const graph& G, node_array<int>& dfsnum, node_array<int>& compnum) { list<edge> T; dfsnum_counter = compnum_counter = 0; dfsnum.init(g,-); // declares all nodes unreached node v; forall_nodes(v,g) if (dfsnum[v] == -) dfs(v,dfsnum,compnum,t); } return T; 34 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος static int dfsnum_counter; static int compnum_counter; static void dfs(node v, node_array<int>& dfsnum, node_array<int>& compnum, list<edge>& T) { dfsnum[v] = ++dfsnum_counter; edge e; forall_adj_edges(e,v) { node w = target(e); if (dfsnum[w] == -) { T.append(e); dfs(w,dfsnum,compnum,t); } } } compnum[v] = ++compnum_counter; 35 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Πλάτος s 3 5 7 0 5 4 4 0 9 3 6 8 3 36 / 46

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Πλάτος void BFS(const graph& G, node s, node_array<int>& dist) { queue<node> Q; node v,w; forall_nodes(w,g) dist[w] = -; } dist[s] = 0; Q.append(s); while (!Q.empty() ) { v = Q.pop; forall_adj_nodes(w,v) if (dist[w] < 0) { Q.append(w); dist[w] = dist[v]+; } } 37 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη 38 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη Ελεγχος εάν ένα δεδοµένο κατευθυνόµενο γράφηµα G = (V, E) είναι άκυκλο 38 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη Ελεγχος εάν ένα δεδοµένο κατευθυνόµενο γράφηµα G = (V, E) είναι άκυκλο Αν ναι, υπολογισµός της τοπολογικής διάταξης ή ταξινόµησης: εύρεση αρίθµησης l : V IN τέτοια ώστε (x, y) E, l(x) < l(y) 38 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη 39 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη Αλγόριθµος: επαναληπτική διαδικασία Σε κάθε επανάληψη, επιλογή κορυφής v µε µηδενικό ϐαθµό-εισόδου Ανάθεση στην v της επόµενης τιµής στην αρίθµηση, και διαγραφή της µαζί µε τις εξερχόµενες ακµές της Αν σε κάποια επανάληψη δεν υπάρχουν κορυφές µηδενικού ϐαθµού-εισόδου, τότε η επαναληπτική διαδικασία τερµατίζει αλλιώς, συνεχίζει Αν στον τερµατισµό το G είναι το κενό γράφηµα, τότε είναι άκυκλο αλλιώς, περιέχει κύκλο 39 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη Αλγόριθµος: επαναληπτική διαδικασία Σε κάθε επανάληψη, επιλογή κορυφής v µε µηδενικό ϐαθµό-εισόδου Ανάθεση στην v της επόµενης τιµής στην αρίθµηση, και διαγραφή της µαζί µε τις εξερχόµενες ακµές της Αν σε κάποια επανάληψη δεν υπάρχουν κορυφές µηδενικού ϐαθµού-εισόδου, τότε η επαναληπτική διαδικασία τερµατίζει αλλιώς, συνεχίζει Αν στον τερµατισµό το G είναι το κενό γράφηµα, τότε είναι άκυκλο αλλιώς, περιέχει κύκλο Χρόνος εκτέλεσης: O(n + m) - γιατί ; 39 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη 40 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη Ζητείται συνάρτηση bool TOPSORT(const graph& G, node_array<int>& ord); η οποία επιστρέφει true αν το G είναι άκυκλο, αλλιώς false. Στην πρώτη περίπτωση επιστρέφει επίσης την τοπολογική διάταξη των κορυφών του G στον πίνακα ord 40 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη Ζητείται συνάρτηση bool TOPSORT(const graph& G, node_array<int>& ord); η οποία επιστρέφει true αν το G είναι άκυκλο, αλλιώς false. Στην πρώτη περίπτωση επιστρέφει επίσης την τοπολογική διάταξη των κορυφών του G στον πίνακα ord Πώς υλοποιείται ο αλγόριθµος χωρίς διαγραφή του γραφήµατος ; 40 / 46

Γραφήµατα στην LEDA Τοπολογική ιάταξη bool TOPSORT(const graph& G,node_array<int>& ord) { // initialization node_array<int> INDEG(G); queue<node> ZEROINDEG; node v,w; forall_nodes(v,g) if ( (INDEG[v] = G.indeg(v)) == 0 ) ZEROINDEG.append(v); // removing nodes of indegree zero int count = 0; ord.init(g); while (!ZEROINDEG.empty()) { v = ZEROINDEG.pop(); ord[v] = ++count; forall_out_edges(e,v) { node w = G.target(e); if ( --INDEG[w] == 0 ) ZEROINDEG.append(w); } } return (count == G.number_of_nodes()); } 4 / 46

Γραφήµατα στην LEDA Γεννήτριες Γραφηµάτων 4 / 46

Γραφήµατα στην LEDA Γεννήτριες Γραφηµάτων ηµιουργία γραφηµάτων µε ακολουθίες λειτουργιών new_node και new_edge είναι αρκετά κουραστική (και ϐαρετή) 4 / 46

Γραφήµατα στην LEDA Γεννήτριες Γραφηµάτων ηµιουργία γραφηµάτων µε ακολουθίες λειτουργιών new_node και new_edge είναι αρκετά κουραστική (και ϐαρετή) Η LEDA παρέχει µια αρκετά µεγάλη συλλογή από γεννήτριες γραφηµάτων ηµιουργία πλήρους γραφήµατος G µε n κορυφές: v, w G, η ακµή (v, w) ανήκει στο G complete_graph(graph& G, int n); ηµιουγία τυχαίου γραφήµατος µε n κορυφές και m ακµές random_graph(graph& G, int n, int m); διάφορες άλλες γεννήτριες οι οποίες κατασκευάζουν ειδικά γραφήµατα, π.χ. επίπεδα (planar), πλέγµατα (grids), διµερή (bipartite), κλπ 4 / 46

Γραφήµατα στην LEDA δηµιουργία τυχαίων γραφηµάτων 43 / 46

Γραφήµατα στην LEDA δηµιουργία τυχαίων γραφηµάτων Η κλήση random_graph(graph& G, int n, int m, bool no_anti_parallel_edges, bool loopfree, bool no_parallel_edges); δηµιουργεί ένα τυχαίο γράφηµα G µε n κορυφές και m ακµές σύµφωνα µε το µοντέλο G n,m 43 / 46

Γραφήµατα στην LEDA δηµιουργία τυχαίων γραφηµάτων Η κλήση random_graph(graph& G, int n, int m, bool no_anti_parallel_edges, bool loopfree, bool no_parallel_edges); δηµιουργεί ένα τυχαίο γράφηµα G µε n κορυφές και m ακµές σύµφωνα µε το µοντέλο G n,m Μια τυχαία ακµή επιλέγεται από ένα σύνολο C που ορίζεται ως εξής Το C αρχικοποιείται µε το σύνολο όλων των n Ϲευγών των κορυφών, αν loopfree = false, ή µε το σύνολο όλων των n(n ) Ϲευγών διαφορετικών κορυφών, αν loopfree = true Η επιλογή ενός Ϲεύγους (v, w) από το C συνεπάγεται τη διαγραφή του από το C αν no_parallel_edges = true, και το αντίθετο Ϲεύγος (w, v) διαγράφεται από το C αν no_anti_parallel_edges = true 43 / 46

Γραφήµατα στην LEDA δηµιουργία τυχαίων γραφηµάτων Ειδικές περιπτώσεις της random_graph // The following pairs of calls are equivalent random_graph(g,n,m); random_graph(g,n,m,false,false,false); random_simple_graph(g,n,m); random_graph(g,n,m,false,false,true); random_simple_loopfree_graph(g,n,m); random_graph(g,n,m,false,true,true); random_simple_undirected_graph(g,n,m); random_graph(g,n,m,true,true,true); 44 / 46

Γραφήµατα στην LEDA δηµιουργία γραφηµάτων 45 / 46

Γραφήµατα στην LEDA δηµιουργία γραφηµάτων Η συνάρτηση void test_graph(graph& G) δηµιουργεί διαλογικά ένα γράφηµα που ορίζεται από τον χρήστη 45 / 46

Ερωτήσεις ; 46 / 46