ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 10 ο Γράφοι Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης
Γράφοι Ορισµός Αφηρηµένος τύπος δεδοµένων Υλοποίηση Αναζήτηση έντρο επικάλυψης Μεταβατική κλειστότητα Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 2
Ορισµός Γράφος G=(V,E) V(G): πεπερασµένο µη κενό σύνολο κορυφών Ε(G): σύνολο ακµών (ζεύγη κορυφών) Μη κατευθυνόµενος γράφος (undirected) Οι κορυφές των ακµών δεν έχουν διάταξη Αν (v 1,v 2 ) ακµή, οι κορυφές v 1 και v 2 γειτονικές (adjacent) Κατευθυνόµενος γράφος (directed) Οι ακµές είναι κατευθυνόµενες, π.χ. στην ακµή <v 1, v 2 >v 1 : ουρά, v 2 : κεφαλή Αν <v 1,v 2 > ακµή, η v 1 γειτονική προς την v 2, και η v 2 γειτονική από την v 1 1 1 2 4 2 4 3 3 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 3
Μονοπάτι Μονοπάτι από την κορυφή vp στην vq Ακολουθία κορυφών µε (v q, v 1 ), (v 1, v 2 ),, (v n, v q ) E(G) Μήκος µονοπατιού το πλήθος των ακµών του Απλό αν οι κορυφές του (εκτός πρώτης και τελευταίας) διαφορετικές Κύκλος απλό µονοπάτι στο οποίο η πρώτη και η τελευταία κορυφή ταυτίζονται Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 4
Συνδετικότητα Μη κατευθυνόµενος γράφος Ακυκλικός αν δεν περιέχει κύκλους Συνδεδεµένος αν για κάθε ζεύγος κορυφών v i, v j υπάρχει µονοπάτι από τη v i στη v j Βαθµός κορυφής το πλήθος των ακµών που έχουν άκρο την κορυφή Κατευθυνόµενος γράφος Ισχυρά συνδεδεµένος αν για κάθε ζεύγος κορυφών v i, v j υπάρχει κατευθυνόµενο µονοπάτι από την v i στη v j και από τη v j στη v i Ασθενώς συνδεδεµένος αν ο αντίστοιχος µη κατευθυνόµενος γράφος είναι συνδεδεµένος Έσω-βαθµός κορυφής είναι το πλήθος των ακµών που έχουν την κορυφή κεφαλή Έξω-βαθµός κορυφής είναι το πλήθος των ακµών που έχουν την κορυφή ουρά Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 5
Αφηρηµένος Τύπος εδοµένων Γράφος Create ηµιουργία γράφου Insert edge Εισαγωγή ακµής Delete edge ιαγραφή ακµής Insert vertex Εισαγωγή κορυφής Delete vertex ιαγραφή κορυφής Adjacent Υπαρξη ακµής µεταξύ κορυφών... Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 6
Πίνακας Γειτνίασης Έστω γράφος G=(V,E) µε n 1 Ο πίνακας γειτνίασης είναι δισδιάστατος nxn πίνακας Α µε a ij = 1, αν (v i, v j ) E(G) και a ij = 0, αν (v i, v j ) E(G) 1 3 0 1 1 0 1 3 0 1 0 0 2 A = 1 0 1 1 1 1 0 0 2 A = 0 0 0 0 0 1 0 0 4 0 1 0 0 4 0 1 0 0 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 7
Υλοποίηση µε Πίνακα #define N 10 int adj[n][n]; /* θεωρούµε κατευθυνόµενο γράφο µε N κορυφές */ void addedge(int a[], int v1, int v2) { if (v1 >= 0 && v1 < N && v2 >= 0 && v2 < N) a[v1][v2] = 1; } void deledge(int a[], int v1, int v2) { if (v1 >= 0 && v1 < N && v2 >= 0 && v2 < N) a[v1][v2] = 0; } intadjacent(inta[], intv1, intv2) { if (v1 >= 0 && v1 < N && v2 >= 0 && v2 < N) return (a[v1][v2]); else return -1; /* λάθος κορυφής */ } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 8
Λίστα Ακµών Σε κάθε κορυφή αντιστοιχεί ένας κόµβος Οι κόµβοι κορυφών σχηµατίζουν συνδεδεµένη λίστα Σε κάθε κορυφή αντιστοιχούν κάποιοι κόµβοι ακµών Οι κόµβοι ακµών κάθε κορυφής σχηµατίζουν ξεχωριστή λίστα 1 2 4 3 1 2 3 λίστα κορυφών 4 λίστα ακµών Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 9
Υλοποίηση µε Λίστα Ακµών typedef struct node *nodeptr_t; typedef struct node { int data; nodeptr_t vertex, edge; } node_t; /* κορυφήήακµή */ typedef nodeptr_t graph_t; graph_t g; /* γράφος */ int adjacent{ nodeptr_t p, nodeptr_q) { nodeptr_t c = p->edge; /* διατρέχουµε τηλίσταάκµών */ while (c) if (c->vertex == q) return 1; else c = c->edge; return 0; } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 10
Εισαγωγή Κορυφής και Ακµής void insertvertex(int data, graph_t *g) { nodeptr_t c = (nodeptr_t) malloc(sizeof(node_t)); c->data = data; void insertedge( nodeptr_t p, if (!adjacent(p, q)) { nodeptr_t q) { nodeptr_t c = (nodeptr_t) malloc(node_t); } /* λίστα κορυφών */ c->vertex = *g; /* λίστα ακµών */ c->edge = NULL; *g = c; } } /* λίστα ακµών */ c->vertex = q; /* λίστα κορυφών */ c->edge = p->edge; p->edge = c; Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 11
Αναζήτηση πρώτα κατά βάθος Έστω ότι κατά τη διαδροµή επισκεπτόµαστε την κορυφή vµε γειτονικές w 1, w 2,, w n Στη συνέχεια επισκεπτόµαστε την κορυφή w 1 και τις γειτονικές της πριν προχωρήσουµε στιςw 2,,w n Α Β C D E DFS: ABEFHCDG F G /* DFS: depth first search */ for (i = 0; i < n; i++) visited[v i ] = 0 for (i = 0; i < n; i++) if (!visited[v i ]) dfstraverse(v i ) dfstraverse(v) visited[v] = 1, visit(v) γειτονική κορυφή w της v if (!visited[w]) /* ακµή (v,w) */ dfstraverse(w) H Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 12
Αναζήτηση πρώτα κατά πλάτος Έστω ότι κατά τη διαδροµή επισκεπτόµαστε την κορυφή vµε γειτονικές w 1, w 2,, w n Στη συνέχεια επισκεπτόµαστε τις κορυφές w 1, w 2,,w n πριν επισκεπτούµε τις γειτονικές της w 1 κοκ. Α Β C D E BFS: ABCDEFGH F G /* BFS: breadth first search */ for (i = 0; i < n; i++) visited[v i ] = 0 for (i = 0; i < n; i++) if (!visited[v i ]) bfstraverse(v i ) bfstraverse(v) visited[v] = 1, enqueue(q, v) while (!empty(q)) u = dequeue(q), visit(u) γειτονική κορυφή w της u if (!visited[w]) /* ακµή (u,w)*/ visited[w] = 1 enqueue(q, w) H Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 13
Πολυπλοκότητα DFS & BFS Με πίνακα γειτνίασης Ο( V ) για την επίσκεψη κάθε κόµβου Ο( V 2 ) για την επίσκεψη όλων των γειτονικών κάθε κόµβου Σύνολο: Ο( V + V 2 ) = O( V 2 ) Με λίστα ακµών Ο( V ) για την επίσκεψη κάθε κόµβου Ο( E ) για την επίσκεψη όλων των γειτονικών κάθε κόµβου Σύνολο: Ο( V + E ) Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 14
έντρο Επικάλυψης (Spanning Tree) Από γράφο G παίρνουµε υπογράφοτµε ιδιότητες Συνδεδεµένος ακυκλικός γράφος (δέντρο) Περιέχει όλες τις κορυφές του G Περιέχει ελάχιστο πλήθος ακµών του G Γενικά για κάθε δέντρο ισχύει E = V - 1 Κάθε κόµβοςεκτόςτηςρίζαςέχειµοναδικό γονέα Κάθε ακµή συνδέει έναν κόµβο µε τον γονέα του Μπορούµε ναδηµιουργήσουµε δέντρο επικάλυψης Με αναζήτηση πρώτα κατά βάθος ή πλάτος (DFS ή BFS) Αρκεί να σηµειώνουµε κάθε ακµή πουχρησιµοποιούµε DFS Spanning Tree 3 1 2 4 BFS Spanning Tree 3 1 2 4 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 15
Μεταβατική Κλειστότητα Υπάρχει µονοπάτι από µία κορυφή σε άλλη κορυφή του γράφου; Αν υπάρχει µονοπάτι µήκους 1, τότε A[i][j] = 1 Αν υπάρχει µονοπάτι µήκους 2, τότε A[i][1] Λ A[1][j] V V A[i][n] Λ A[n][j] = 1, και γενικά αρκεί να υπολογίσουµε τηντιµή του πίνακα A ( 2 ) n = A[i][k] A[k][j] k =1 Για να εξετάσουµεανυπάρχει µονοπάτι µήκους m n, αρκεί να υπολογίσουµε τηντιµή του πίνακα A (m) = A A (m 1 ) µ ε Α ( 1 ) = Α, m = 2,...,n Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 16
Μείωση Κόστους Υπολογισµού Εφόσον το κόστος πολλαπλασιασµού δύο πινάκων nxn είναι Ο(n 3 ) το συνολικό κόστος για τον υπολογισµό τουα (n) είναι Ο(n 4 ) Εναλλακτικά έστω P k πίνακας τέτοιος ώστε P k [i][j] = 1, αν και µόνο αν υπάρχει µονοπάτι από την v i στην v j που περνά µόνον από τις κορυφές v 1,,v k Αν P k [i][j] = 1, τότε υπάρχει µονοπάτι από τη v i στη v j που περνά µόνο από τις v 1,...,v k (άρα και τις v 1,,v k+1 ), οπότε P k+1 [i][j] = 1 Αν P k [i][j]=0 και P k+1 [i][j]=1, τότε P k [i][k+1] = 1 και P k [k+1][j] = 1 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 17
Αλγόριθµος Warshall (1962) Pnew = A for k: 0..n-1 Pold = Pnew for i: 0..n-1 if (Pold[i][k]) for j: 0..n-1 if (Pold[k][j]) Pnew[i][j] = 1 /* υπολογισµός Pk */ Συνολικό κόστος: O(n 3 ) Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 18