Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Data Science & Engineering Lab
Θεωρία & Αλγόριθμοι Γράφων Συντομότερα μονοπάτια Dijkstra, Bellman-Ford, Johnson, Floyd, Warshall Data Science & Engineering Lab
2
Data Science & Engineering Lab
Συντομότερα μονοπάτια Σε μη ζυγισμένο γράφο τα συντομότερα μονοπάτια βρίσκονται με διάσχιση BFS Αλγόριθμοι για ζυγισμένους γράφους Dijkstra (1-to-all, χωρίς αρνητικά βάρη) Bellman-Ford (1-to-all, με αρνητικά βάρη) Johnson (all-to-all, με αρνητικά βάρη) Floyd (all-to-all) Warshall (μεταβατική κλειστότητα) Data Science & Engineering Lab
3
Data Science & Engineering Lab
Edger Wybe Dijkstra 1930, Rotterdam – 2002, Nuenen Έλαβε το Turing Award το 1972 Schlumberger Centennial Chair of Computer Sciences στο University of Texas at Austin ( ) Δημοσίευσε εναντίον της χρήσης της εντολής GOTO στις γλώσσες προγραμματισμού και συντέλεσε στην απαξίωσή της Edsger Dijkstra: “Go To Statement Considered Harmful“, CACM, Vol.11, No.3, pp.147–148, 1968. Συνέγραψε πολλές εργασίες σχετικά με τον προγραμματισμό "Computer Science is no more about computers than astronomy is about telescopes" Data Science & Engineering Lab
4
Data Science & Engineering Lab
Aλγόριθμος Dijkstra (1956, 1959) Προσέγγιση: Άπληστη Είσοδος: ζυγισμένος γράφος G={E,V} και κορυφή v∈V, με μη αρνητικά βάρη Έξοδος: τα συντομότερα μονοπάτια (ή τα ίδια τα συντομότερα μονοπάτια) από την κορυφή v∈V προς όλες τις άλλες κορυφές (1-to-all) Ο ίδιος βασικά αλγόριθμος με λίστες προτάθηκε από τους Leyzorek et al. (1957). Data Science & Engineering Lab
5
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - ψευδοκώδικας Data Science & Engineering Lab
6
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - ψευδοκώδικας Ψευδοκώδικας εύρεσης μονοπατιού Data Science & Engineering Lab
7
Aλγόριθμος Dijkstra - ψευδοκώδικας
Χρήση ουράς προτεραιότητας Data Science & Engineering Lab
8
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
9
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
10
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
11
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
12
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
13
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
14
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
15
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
16
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
17
Data Science & Engineering Lab
Aλγόριθμος Dijkstra - animation Data Science & Engineering Lab
18
Data Science & Engineering Lab
Αλγόριθμος Dijkstra – πολυπλοκότητα H υλοποίηση του Dijkstra χρησιμοποιούσε πίνακες (1956) και συνδεδεμένες λίστες (1959). Με σειριακή αναζήτηση σε πίνακες ή λίστες προκύπτει κόστος O(n2) Για αραιούς γράφους με χρήση συνδεδεμένων λιστών και δυαδικό σωρό προκύπτει O((m+n)∙logn) σωρό Fibonacci προκύπτει O(m+n∙logn) Data Science & Engineering Lab
19
Data Science & Engineering Lab
Bellman-Ford (wiki) Richard Ernest Bellman (1920, NY -1984, LA). He was awarded the IEEE Medal of Honor "for contribu- tions to decision processes and control system theory, particularly the creation and application of dynamic programming“ (1979). His key work is the Bellman equation. He coined the term “curse of dimensionality”. The Bellman Prize in Mathematical Biosciences was created in his honor (1985). Lester Randolph Ford Jr. (1927, Houston). He spe- cialized in network flow problems. Ford's paper with Fulkerson on the maximum flow problem and the Ford- Fulkerson algorithm, published as a technical report in and in a journal in 1956, established the max-flow min-cut theorem. Ford also developed the Bellman-Ford algorithm for finding shortest paths in graphs that have negatively weighted edges before Bellman. Data Science & Engineering Lab
20
Data Science & Engineering Lab
Αλγόριθμος Bellman-Ford Προσέγγιση: Δυναμικός προγραμματισμός Είσοδος: ζυγισμένος γράφος G={E,V} και κορυφή v∈V, με αρνητικά βάρη, χωρίς αρνητικούς κύκλους Έξοδος: τα συντομότερα μονοπάτια (ή τα ίδια τα συντομότερα μονοπάτια) από την κορυφή v∈V προς όλες τις άλλες κορυφές (1-to-all) ή η ένδειξη ότι ότι υπάρχει αρνητικός κύκλος O αλγόριθμος αρχικά προτάθηκε από τον Alfonso Shimbel (1955) αλλά πήρε το όνομα των Richard Bellman και Lester Ford που τον δημοσίευσαν ανεξάρτητα το 1958 και το 1956 αντιστοίχως. Ο Edward Moore επίσης δημοσίευσε τον ίδιο αλγόριθμο το 1957 και για αυτό το λόγο ονομάζεται και αλγόριθμος Bellman-Ford-Moore. Data Science & Engineering Lab
21
Αλγόριθμος Bellman-Ford - ψευδοκώδικας
Πως υλοποιείται ο εσωτερικός βρόχος? Data Science & Engineering Lab
22
Data Science & Engineering Lab
Αλγόριθμος Bellman-Ford - animation 6 7 9 2 5 -2 8 -3 -4 s t x y z Σε κάθε πέρασμα εξετάζονται οι ακμές με τη σειρά: (t,x), (t,y), (t,z), (x,t), (y,x), (y,z), (z,x), (z,s), (s,t), (s,y) Data Science & Engineering Lab
23
Data Science & Engineering Lab
Αλγόριθμος Bellman-Ford - animation 6 7 9 2 5 -2 8 -3 -4 s t x y z Σε κάθε πέρασμα εξετάζονται οι ακμές με τη σειρά: (t,x), (t,y), (t,z), (x,t), (y,x), (y,z), (z,x), (z,s), (s,t), (s,y) Data Science & Engineering Lab
24
Data Science & Engineering Lab
Αλγόριθμος Bellman-Ford - animation 6 7 9 2 5 -2 8 -3 -4 4 s t x y z Σε κάθε πέρασμα εξετάζονται οι ακμές με τη σειρά: (t,x), (t,y), (t,z), (x,t), (y,x), (y,z), (z,x), (z,s), (s,t), (s,y) Data Science & Engineering Lab
25
Data Science & Engineering Lab
Αλγόριθμος Bellman-Ford - animation 6 7 9 2 5 -2 8 -3 -4 4 s t x y z Σε κάθε πέρασμα εξετάζονται οι ακμές με τη σειρά: (t,x), (t,y), (t,z), (x,t), (y,x), (y,z), (z,x), (z,s), (s,t), (s,y) Data Science & Engineering Lab
26
Data Science & Engineering Lab
Αλγόριθμος Bellman-Ford - animation 6 7 9 2 5 -2 8 -3 -4 4 s t x y z vertex: s u v x y distance: 2 4 7 -2 predecessor: null Σε κάθε πέρασμα εξετάζονται οι ακμές με τη σειρά: (t,x), (t,y), (t,z), (x,t), (y,x), (y,z), (z,x), (z,s), (s,t), (s,y) Data Science & Engineering Lab
27
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 6 7 8 -2 1 2 9 5 -8 v1 v3 v4 v5 v6 v7 v8 5 Οι γαλάζιες ακμές δημιουργούν έναν αρνητικό κύκλο Θα εξετασθούν οι κορυφές κατά την αρίθμησή τους Data Science & Engineering Lab
28
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 5 i=1 v3 6 11 6 -2 1 v1 8 7 12 v4 7 9 2 v6 6 16 v5 2 5 -8 v7 9 1 v8 Με έντονο βέλος συμβολίζεται ο predecessor Data Science & Engineering Lab
29
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 5 i=2 v3 6 11 6 -2 1 v1 8 7 12 v4 7 9 2 v6 5 15 v5 2 5 -8 v7 8 v8 Με έντονο βέλος συμβολίζεται ο predecessor Data Science & Engineering Lab
30
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 5 i=3 v3 6 11 6 -2 1 v1 8 7 12 v4 7 9 2 v6 4 14 v5 2 5 -8 v7 7 -1 v8 Με έντονο βέλος συμβολίζεται ο predecessor Data Science & Engineering Lab
31
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 5 i=4 v3 6 11 6 -2 1 v1 8 7 12 v4 7 9 2 v6 3 13 v5 2 5 -8 v7 6 -2 v8 Με έντονο βέλος συμβολίζεται ο predecessor Data Science & Engineering Lab
32
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 5 i=5 v3 6 11 6 -2 1 v1 8 7 12 v4 7 9 2 v6 2 12 v5 2 5 -8 v7 5 -3 v8 Με έντονο βέλος συμβολίζεται ο predecessor Data Science & Engineering Lab
33
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 5 i=6 v3 6 11 6 -2 1 v1 8 7 12 v4 7 9 2 v6 1 11 v5 2 5 -8 v7 4 -4 v8 Με έντονο βέλος συμβολίζεται ο predecessor Data Science & Engineering Lab
34
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 5 i=7 v3 6 11 6 -2 1 v1 8 7 12 v4 7 9 2 v6 10 v5 2 5 Τέλος διπλού βρόχου -8 v7 3 -5 v8 Με έντονο βέλος συμβολίζεται ο predecessor Data Science & Engineering Lab
35
Data Science & Engineering Lab
Παράδειγμα Bellman-Ford – αρνητικοί κύκλοι v2 5 i=8 v3 6 11 6 -2 1 v1 8 7 12 v4 7 9 2 v6 -1 9 v5 2 5 -8 v7 2 -6 v8 Οι καφέ κόμβοι άλλαξαν τιμές υπάρχει κύκλος Data Science & Engineering Lab
36
Data Science & Engineering Lab
Σχόλια για αλγόριθμο Bellman-Ford Η απόσταση για κάποια κορυφή μπορεί να αλλάξει περισσότερο από 1 φορά σε κάθε πέρασμα. Μπορεί ο αλγόριθμος να συγκλίνει σε λιγότερο από n-1 περάσματα. Μπορεί να τερματισθεί νωρίτερα με μία λογική σημαία (σαν bubblesort). Μία άλλη υλοποίηση στον εσωτερικό βρόχο θεωρεί με τη σειρά τις κορυφές και για κάθε μία λαμβάνει τις ακμές που ξεκινούν από αυτήν. Ανεξαρτήτως υλοποίησης η σύγκλιση εξαρτάται από τη σειρά θεώρησης των κορυφών ή των ακμών αλλά η πολυπλοκότητα δεν αλλάζει. Data Science & Engineering Lab
37
Data Science & Engineering Lab
Αλγόριθμος Bellman-Ford - πολυπλοκότητα O(n) O(n∙m) O(m) Η πολυπλοκότητα του αλγορίθμου Bellman-Ford είναι O(n∙m) Data Science & Engineering Lab
38
Άσκηση - Αλγόριθμος Bellman-Ford
τις ακμές με τη σειρά (S,A),(S,G),(A,E),(B,A), (B,C),(C,D),(D,E), (E,B),(F,A), (F,E),(G,F) τις κορυφές με τη σειρά S, G, F, E, D, C, B, A
39
Data Science & Engineering Lab
Donald Johnson (wiki) Donald Bruce Johnson ( ) was a researcher in the design and analysis of algorithms. Johnson received his Ph.D. from Cornell University in under the supervision of David Gries. He took a faculty position in the CS department at Penn State University, and later moved to the department of mathematics at Dartmouth. When the Dartmouth CS department was founded in 1994, he became its first chair. Johnson invented the d-ary heap data structure, and is also known for Johnson's algorithm for the all-pairs shortest path problem. Data Science & Engineering Lab
40
Data Science & Engineering Lab
Αλγόριθμος Johnson - κίνητρο Για να υπολογίσουμε τα συντομότερα μονοπάτια all-to-all, μπορούμε να τρέξουμε n φορές τον αλγόριθμο Dijkstra που δεν δέχεται ακμές με αρνητικά βάρη και είναι Ο[(m+n)∙logn] τον αλγόριθμο Bellman-Ford που δέχεται ακμές με αρνητικά βάρη και είναι Ο(n∙m) Αν δίνεται ένας αραιός γράφος, τότε οι πολυπλοκότητες είναι Ο(n∙logn) και O(n2). Άρα, ο Dijkstra προτιμητέος. Αν ο αραιός γράφος έχει ακμές με αρνητικό βάρος, τότε ο Dijkstra απαγορευτικός. Data Science & Engineering Lab
41
Data Science & Engineering Lab
Αλγόριθμος Johnson (1977) Ο αλγόριθμος Johnson αποτελείται από τα εξής βήματα: Δημιουργείται ένας νέος κόμβος q και συνδέεται με όλους του κόμβους με ακμές βάρους 0. Χρησιμοποιείται ο αλγόριθμος Bellman-Ford για την εύρεση του μήκους συντομότερου μονοπατιού h(v) κάθε κόμβου v από τον κόμβο q. Οι ακμές του γράφου λαμβάνουν νέα βάρη ως εξής: το νέο βάρος μίας ακμής από τον κόμβο u προς τον κόμβο v και με βάρος w(u,v), ισούται με w(u,v)+h(u)−h(v) Ο κόμβος q διαγράφεται και χρησιμοποιείται ο αλγόρι- θμος Dijkstra για την εύρεση όλων των συντομότερων μονοπατιών (all-to-all). Data Science & Engineering Lab
42
Data Science & Engineering Lab
Παράδειγμα - αλγόριθμος Johnson Ο γράφος έχει αρνητικές ακμές αλλά όχι αρνητικούς κύκλους. Βήμα 1ο. Εισάγουμε τον κόμβο q και τον ενώνουμε με όλους τους κόμβους με ακμές βάρους 0. 2 1 4 3 8 -5 -4 6 7 v1 v2 v3 v4 v5 q Data Science & Engineering Lab
43
Data Science & Engineering Lab
Παράδειγμα - αλγόριθμος Johnson Βήμα 2ο. Τρέχουμε τον αλγόριθμο Bellman-Ford και βρίσκουμε το μήκος των συντομότερων μονοπατιών του κόμβου q από κάθε κόμβο. -1 -5 -4 2 1 4 3 8 6 7 v1 v2 v3 v4 v5 Data Science & Engineering Lab
44
Data Science & Engineering Lab
Παράδειγμα - αλγόριθμος Johnson 2 4 13 10 v1 v2 v3 v4 v5 Βήμα 3ο. Υπολογίζουμε τα νέα βάρη των ακμών που πλέον δεν είναι αρνητικά. Βήμα 4ο. Τρέχουμε τον αλγόριθμο Dijkstra για κάθε κόμβο. Ποιά είναι η πολυπλοκότητα του αλγορίθμου Johnson? Data Science & Engineering Lab
45
Data Science & Engineering Lab
Διατήρηση μονοπατιών Αλλάζουν τα βάρη των ακμών, όχι όμως τα συντομότερα μονοπάτια. Στους δύο γράφους: ποιό είναι το συντομότερο μονοπάτι από τον v1 στον v2 ? ποιό είναι το συντομότερο μονοπάτι από τον v2 στον v5 ? 2 1 4 3 8 -5 -4 6 7 v1 v2 v3 v4 v5 2 4 13 10 v1 v2 v3 v4 v5 Data Science & Engineering Lab
46
Data Science & Engineering Lab
Συντομότερα μονοπάτια σε DAG Ο κατευθυνόμενος άκυκλος γράφος ονομάζεται DAG (directed acyclic graph) Η εύρεση συντομότερων μονοπατιών σε DAG μπορεί να γίνει με Bellman-Ford. Η τοπολογική ταξινόμηση-topological sorting τοποθετεί τους κόμβους ενός DAG επί ευθείας ώστε όλες οι ακμές να έχουν κοινή κατεύθυνση (από αριστερά προς τα δεξιά). Tα συντομότερα μονοπάτια σε ένα DAG μπορούν να βρεθούν με ένα πέρασμα λαμβάνοντας στη σειρά τους κόμβους της τοπολογικής ταξινόμησης. Data Science & Engineering Lab
47
Data Science & Engineering Lab
Μονοπάτια σε DAG - animation 6 1 u r s t v w 5 2 7 –1 –2 4 3 2 Δίνεται η τοπολογική ταξινόμηση. Ζητούνται τα συντομότερα μονοπάτια από τον κόμβο s. Αρχικοποίηση: μήκος συντομότερου μονοπατιού 0 για τον s και ∞ για τους υπόλοιπους. Data Science & Engineering Lab
48
Data Science & Engineering Lab
Μονοπάτια σε DAG - animation 6 1 u r s t v w 5 2 7 –1 –2 4 3 2 Data Science & Engineering Lab
49
Data Science & Engineering Lab
Μονοπάτια σε DAG - animation 6 1 u r s t v w 5 2 7 –1 –2 2 6 4 3 2 Data Science & Engineering Lab
50
Data Science & Engineering Lab
Μονοπάτια σε DAG - animation 6 1 u r s t v w 5 2 7 –1 –2 2 6 6 4 4 3 2 Data Science & Engineering Lab
51
Data Science & Engineering Lab
Μονοπάτια σε DAG - animation 6 1 u r s t v w 5 2 7 –1 –2 2 6 5 4 4 3 2 Data Science & Engineering Lab
52
Data Science & Engineering Lab
Μονοπάτια σε DAG - animation 6 1 u r s t v w 5 2 7 –1 –2 2 6 5 3 4 3 2 Data Science & Engineering Lab
53
Data Science & Engineering Lab
Μονοπάτια σε DAG - animation 6 1 u r s t v w 5 2 7 –1 –2 2 6 5 3 4 3 2 Ποιά είναι η πολυπλοκότητα ? Data Science & Engineering Lab
54
Data Science & Engineering Lab
Robert Floyd (wiki) Robert (Bob) Floyd (1936–2001) Turing award 1978 His contributions include Floyd-Warshal algorithm, which efficiently finds all shortest paths in a graph, Floyd’s cycle-finding algorithm for detecting cycles in a sequence, and his work on parsing. the important concept of error diffusion for rendering images, also called Floyd-Steinberg dithering (though he distinguished dithering from diffusion). pioneering the field of program verification using logical assertions with the 1967 paper Assigning Meanings to Programs. This was an important contribution to what later became Hoare logic. Data Science & Engineering Lab
55
Data Science & Engineering Lab
Αλγόριθμος Floyd (1962) Προσέγγιση: Δυναμικός προγραμματισμός Είσοδος: ζυγισμένος γράφος G={E,V} και κορυφή v∈V, με αρνητικά βάρη αλλά όχι αρνητικούς κύκλους Έξοδος: τα συντομότερα μονοπάτια (ή τα ίδια τα συντομότερα μονοπάτια) από όλες τις κορυφές προς όλες τις άλλες κορυφές (all-to-all). Ο αλγόριθμος Floyd δημοσιεύθηκε το Ωστόσο, ήταν βασικά ίδιος με έναν αλγόριθμο του Bernard Roy (1959) και με έναν αλγόριθμο του Stephen Warshall (1962) για την εύρεση της μεταβατικής κλειστότητας. Η υλοποίηση του αλγορίθμου με ένα τριπλό βρόχο περιγράφηλε από τον Peter Ingerman (1962). Ο αλγόριθμος είναι γνωστός και ως Floyd- Warshall, Roy–Warshall ή Roy–Floyd ή ως WFI αλγόριθμος. Data Science & Engineering Lab
56
Data Science & Engineering Lab
Αλγόριθμος Floyd - ψευδοκώδικας Πολυπλοκότητα O(n3) Ποιά είναι η διαφορά από τον αλγόριθμο του Dijkstra ? Data Science & Engineering Lab
57
Data Science & Engineering Lab
Αλγόριθμος Floyd - παράδειγμα 5 ∞ 2 3 7 4 1 Data Science & Engineering Lab
58
Data Science & Engineering Lab
Αλγόριθμος Floyd – παράδειγμα (2) Data Science & Engineering Lab
59
Data Science & Engineering Lab
Αλγόριθμος Floyd - ψευδοκώδικας Πολυπλοκότητα ? Εύρεση μονοπατιών Data Science & Engineering Lab
60
Data Science & Engineering Lab
Αλγόριθμος Floyd – αρνητικοί κύκλοι Μπορεί ο αλγόριθμος Floyd να χειριστεί ακμές με αρνητικά βάρη και αρνητικούς κύκλους? Μπορεί να χειριστεί ακμές με αρνητικές τιμές. Αν υπάρχει αρνητικός κύκλος, τότε το κλειστό μονοπάτι (i, …, i) θα έχει αρνητική τιμή αν και θα έπρεπε να έχει 0. Συνεπώς, αν στο τέλος του αλγορίθμου ο πίνακας dist περιέχει αρνητικές τιμές στην διαγώνιο, αυτό σημαίνει ότι υπάρχει αρνητικός κύκλος και συνεπώς δεν έχει νόημα η εύρεση συντομότερων μονοπάτιων στο γράφο. Data Science & Engineering Lab
61
Data Science & Engineering Lab
Steven Warshall Stephen Warshall (1935 NY – 2006, Gloucester/MA). He carried out research and development in operating systems, compiler design, language design and operations research. There is an interesting anecdote about his proof that the transitive closure algorithm is correct. He and a colleague at Technical Operations bet a bottle of rum on who first could determine whether this algorithm always works. Warshall came up with his proof overnight, winning the bet and the rum, which he shared with the loser of the bet. Because Warshall did not like sitting at a desk, he did much of his creative work in unconventional places such as on a sailboat in the Indian Ocean or in a Greek lemon orchard. Data Science & Engineering Lab
62
Data Science & Engineering Lab
Αλγόριθμος Warshall Προσέγγιση: άπληστη μέθοδος Είσοδος: συνδεδεμένος γράφος G={E,V} και ο πίνακας γειτνίασής του Έξοδος: πίνακας που δίνει τη μεταβατική κλειστότητα (transitive closure) Data Science & Engineering Lab
63
Data Science & Engineering Lab
Μεταβατική κλειστότητα - παράδειγμα Ενώνονται όλες οι κορυφές για τις οποίες υπάρχει μονοπάτι μεταξύ τους Εφαρμόζεται σε κατευθυνόμενους και μη κατευθυνόμενους γράφους Data Science & Engineering Lab
64
Data Science & Engineering Lab
Μεταβατική κλειστότητα - παράδειγμα Δίνεται ο επόμενος γράφος με πίνακα γειτνίασης Α Ο πίνακας C μπορεί να προκύψει με διαδοχικούς πολλαπλασιασμούς του πίνακα Α Αν ο πολλαπλασιασμός γίνει με «λογικό» τρόπο, τότε ο πίνακας C δίνει την προσβασιμότητα (reachability), αλλιώς δίνει το πλήθος μονοπατιών Data Science & Engineering Lab
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.