ψευδοκώδικα για την εύρεση κλειστές διαδρομές σε ένα γράφημα

ψήφοι
-1

Έχω μια μήτρα adjaceny για ένα γράφημα το οποίο παρακολουθεί τις ακμές μεταξύ των κόμβων, έχοντας ένα 1 στην αντίστοιχη adjMat [i, j] = 1? Μέσω αυτής της μήτρας adjaceny εύχομαι να μάθετε όλες τις κλειστές διαδρομές μήκους 4 που υπάρχει στο γράφημα. Μπορεί κάποιος παρακαλώ να μου δώσει έναν κωδικό ψευδο. σε ευχαριστώ

Δημοσιεύθηκε 14/03/2009 στις 20:38
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
0

Εφαρμόστε ένα βάθος περιορισμένο βάθος-πρώτα-αναζήτησης σε κάθε κόμβο και ρεκόρ κόμβους όπου η DFS βρίσκει τον κόμβο εκκίνησης. Για την αναζήτηση, δείτε ψευδο-κώδικα εδώ: http://en.wikipedia.org/wiki/Depth-limited_search . Απλά πρέπει να προσθέσω κάτι σαν

if(node' == node && node'.depth==4) memorize(node)

στην αρχή του βρόχου.

Απαντήθηκε 14/03/2009 στις 20:56
πηγή χρήστη

ψήφοι
2

Αυτό ακούγεται σαν στο σπίτι, γι 'αυτό δεν θα δώσει το όλο θέμα μακριά. Αλλά εδώ είναι μια υπόδειξη: από τη στιγμή που ενδιαφέρονται για την εξεύρεση κύκλους μήκους 4, πάρτε την 4η εξουσία της πίνακας γειτνίασης και σάρωση κατά μήκος της διαγωνίου. Εάν οποιαδήποτε καταχώρηση Μ [i, i] είναι μη μηδενική, υπάρχει ένας κύκλος που περιέχει κορυφή i.

Απαντήθηκε 14/03/2009 στις 20:57
πηγή χρήστη

ψήφοι
1

Ίσως δεν είναι ο βέλτιστος τρόπος για να το (είναι υπολογίσουμε O(n^4)), αλλά ένας πολύ απλός τρόπος είναι να σαρώσει μέσα από τις όλες τις κορυφές

a, b, c, d such that b > a, c > b, d > c

Μπορείτε να ελέγξετε στη συνέχεια, ελέγξτε για κάθε ένα από τους ακόλουθους κύκλους:

 1. ([α, b] && [b, c] && [c, d] && [d, α])
 2. ([α, b] && [b, d] && [d, c] && [c, a]) 
 3. ([α, d] && [d, b] && [b, c] && [c, a])

 1: 2: 3:
 Α --- Β Α --- ΒΑΒ
 | | \ / | \ / |
 | | X | X |
 | | / \ | / \ |
 D --- C D --- CCD

Είσαι ουσιαστικά τον έλεγχο κάθε διέταξε σύνολο των κορυφών (α, β, γ, δ) για τους 3 τρόπους που θα μπορούσαν να σχηματίσουν έναν κύκλο.

Έτσι, ο κώδικας ψευδο θα είναι:

for a = 0 to <lastVertex>
 for b = a + 1 to <lastVertex>
  for c = b + 1 to <lastVertex>
   for d = c + 1 to <lastVertex>

    if(IsCycle(a,b,c,d)) AddToList([a,b,c,d])
    if(IsCycle(a,b,d,c)) AddToList([a,b,d,c])
    if(IsCycle(a,c,b,d)) AddToList([a,c,b,d])

   next d
  next c
 next b    
next a
Απαντήθηκε 14/03/2009 στις 21:15
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more