ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Ενότητα 6: Γράφοι Απόστολος Παπαδόπουλος
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Γράφοι
Περιεχόμενα ενότητας 1. DFS σε κατευθυνόμενο γράφο 2. Ελάχιστα Μονοπάτια 3. Τοπολογική Ταξινόμηση 4. Eλάχιστα Ζευγνύοντα Δένδρα 5
ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ Γράφοι
Depth First Search Μέθοδος που χρησιμοποιείται ευρύτατα από πολλούς αλγορίθμους γραφημάτων. Μπορεί να χρησιμοποιηθεί για: Να απαντήσει αν ο γράφος είναι συνεκτικός ή όχι, Να προσδιοριστούν οι συνεκτικές συνιστώσες του γράφου, Να προσδιορίσουμε τα σημεία άρθρωσης, 7
Αλγόριθμος DFS DFS(G) { } for each vertex u G->V { u->color = EMPTY; } time = 0; for each vertex u G->V { if (u->color == EMPTY) DFS_Visit(u); } DFS_Visit(u) { } u->color = YELLOW; time = time+1; u->d = time; for each v u->adj[] { if (v->color == EMPTY) DFS_Visit(v); } u->color = WHITE; time = time+1; u->f = time; 8
Παράδειγμα DFS Πηγή d f 9
Παράδειγμα DFS Πηγή d 1 f 10
Παράδειγμα DFS Πηγή d 1 f 2 11
Παράδειγμα DFS Πηγή d 1 f 2 3 12
Παράδειγμα DFS Πηγή d 1 f 2 3 4 13
Παράδειγμα DFS Πηγή d 1 f 2 3 4 5 14
Παράδειγμα DFS Πηγή d 1 f 2 3 4 5 6 15
Παράδειγμα DFS Πηγή d 1 f 8 2 7 3 4 5 6 16
Παράδειγμα DFS Πηγή d 1 f 8 2 7 9 3 4 5 6 17
Παράδειγμα DFS Πηγή d 1 f 8 2 7 9 3 4 5 6 18
Παράδειγμα DFS Πηγή d 1 f 8 2 7 9 10 3 4 5 6 19
Παράδειγμα DFS Πηγή d 1 f 8 11 2 7 9 10 3 4 5 6 20
Παράδειγμα DFS Πηγή d f 1 12 8 11 2 7 9 10 3 4 5 6 21
Παράδειγμα DFS Πηγή d f 1 12 8 11 13 2 7 9 10 3 4 5 6 22
Παράδειγμα DFS Πηγή d f 1 12 8 11 13 2 7 9 10 3 4 5 6 14 23
Παράδειγμα DFS Πηγή d f 1 12 8 11 13 2 7 9 10 3 4 5 6 1415 24
Παράδειγμα DFS Πηγή d f 1 12 8 11 1316 2 7 9 10 3 4 5 6 1415 25
DAG DAG = Directed Acyclic Graph Κατευθυνόμενος γράφος χωρίς κύκλους 26
Βασικό Θεώρημα Ένας γράφος G(V,E) είναι DAG εάν και μόνο εάν το δένδρο DFS που προκύπτει δεν έχει πίσω βέλη. 27
Τοπολογική Ταξινόμηση Underwear Socks Watch Pants Belt Shirt Tie Shoes Jacket Socks Underwear Pants Shoes Watch Shirt Belt Tie Jacket 28
Μέθοδος Topological-Sort() { } Εκτέλεση DFS Όταν ολοκληρώσουμε την επίσκεψη σε μία κορυφή, τη δίνουμε στην έξοδο. Οι κορυφές δίδονται στην έξοδο με αντίστροφη σειρά. Κόστος: O(V+E) 29
Ελάχιστα Μονοπάτια Πρόβλημα: Σε ένα γράφο G(V,E) με βάρη, δίνονται οι κορυφές Α και Β και ζητείται να προσδιορίσουμε ένα μονοπάτι που έχει το ελάχιστο κόστος μετάβασης από την Α στη Β. 30
Tokyo Subway Map 31
Ελάχιστα Ζευγνύοντα Δένδρα Αλλιώς: Minimum Spanning Trees (MST) Είναι το δένδρο που προκύπτει από έναν γράφο G(V,E) αν κρατήσουμε τις ακμές που δίνουν αθροιστικά το ελάχιστο κόστος και ο γράφος που απομένει είναι συνδεδεμένος. 32
Minimum Spanning Tree Ποιες ακμές πρέπει να κρατήσουμε στο παρακάτω γράφημα για να έχουμε MST? A 6 4 5 9 H B C 14 10 2 15 G E D 3 F 8 33
Minimum Spanning Tree A 6 4 5 9 H B C 14 10 2 15 G E D 3 F 8 34
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 35
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] 14 if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 6 4 5 3 10 8 2 9 15 Run on example graph 36
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] 14 if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 6 4 5 3 10 8 2 9 15 Run on example graph 37
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] 14 r 0 if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 6 4 5 3 10 8 2 Pick a start vertex r 9 15 38
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q 6 4 5 9 key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u 14 0 3 10 8 2 15 u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 39
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q 6 4 5 9 key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u 14 0 3 10 3 8 2 15 u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 40
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q 14 6 4 5 9 key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u 14 0 3 10 3 8 2 15 u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 41
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q 14 6 4 5 9 key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) 14 0 3 u 10 3 8 2 15 u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 42
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u key[u] = ; key[r] = 0; p[r] = NULL; Q while (Q not empty) u = ExtractMin(Q); for each v if (v p[v] = u; Adj[u] Q and w(u,v) < key[v]) key[v] = w(u,v); 14 14 6 4 5 0 8 3 u 10 3 8 2 9 15 43
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u key[u] = ; key[r] = 0; p[r] = NULL; Q while (Q not empty) u = ExtractMin(Q); for each v if (v p[v] = u; Adj[u] Q and w(u,v) < key[v]) key[v] = w(u,v); 14 10 6 4 5 0 8 3 u 10 3 8 2 9 15 44
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u key[u] = ; key[r] = 0; p[r] = NULL; Q while (Q not empty) u = ExtractMin(Q); for each v if (v p[v] = u; Adj[u] Q and w(u,v) < key[v]) key[v] = w(u,v); 14 10 6 4 5 0 8 3 10 3 8 2 u 9 15 45
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 6 4 10 5 2 14 10 2 0 8 3 3 8 u 9 15 46
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 6 4 10 5 9 2 14 10 2 15 0 8 15 3 3 8 u 47
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); u 6 4 10 5 9 2 14 10 2 15 0 8 15 3 3 8 48
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); u 6 4 10 5 9 2 9 14 10 2 15 0 8 15 3 3 8 49
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 4 u 6 4 10 5 9 2 9 14 10 2 15 0 8 15 3 3 8 50
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 4 u 6 4 5 5 9 2 9 14 10 2 15 0 8 15 3 3 51
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); u 6 4 4 5 5 9 2 9 14 10 2 15 0 8 15 3 3 52
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); u 6 4 4 5 5 9 2 9 14 10 2 15 0 8 15 3 3 53
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); u 6 4 4 5 5 9 2 9 14 10 2 15 0 8 15 3 3 54
Prim s Algorithm MST-Prim(G, w, r) Q = V[G]; for each u Q key[u] = ; key[r] = 0; p[r] = NULL; while (Q not empty) u = ExtractMin(Q); for each v Adj[u] if (v Q and w(u,v) < key[v]) p[v] = u; key[v] = w(u,v); 6 4 4 5 5 9 2 9 14 10 2 u 15 0 8 15 3 3 55
Σημείωμα Αναφοράς Copyright, Απόστολος Παπαδόπουλος. «. Γράφοι». Έκδοση: 1.0. Θεσσαλονίκη 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http://eclass.auth.gr/courses/ocrs389/
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά - Μη Εμπορική Χρήση - Όχι Παράγωγα Έργα 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο [1] http://creativecommons.org/licenses/by-nc-nd/4.0/
ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Τέλος ενότητας Επεξεργασία: <Μαυρίδης Απόστολος> Θεσσαλονίκη, <Εαρινό εξάμηνο 2013-2014>
ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ Σημειώματα
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους.