Algoritmo per elencare i cicli di un grafo non orientato

bytec0d3
Salve a tutti, sto facendo un progettino implementativo del calcolo del polinomio cromatico di un grafo G non orientato.
Ho deciso di implementarlo utilizzando la formula di H. Whitney:



dove t="numero di colori" e n="numero vertici del grafo G" e dn,k è così definito:

dn,k = numero di sottoinsiemi di lati di ordine n-k che non contengono circuiti spezzati

L' "algoritmo" dovrebbe essere a grandi linee il seguente:
- dare un ordinamento arbitrario agli archi di G
- elencare i circuiti (cicli) di G
- togliere ad ogni circuito l'arco più grande (secondo l'ordine dato precedentemente)
- quello che si ottiene è l'insieme dei circuiti spezzati di G
- successivamente è facile calcolare il numero dn,k

il punto in cui mi sono incagliato è proprio quello di trovare (/realizzare) un algoritmo per identificare ed elencare tutti i circuiti presenti nel grafo per poi utilizzarli secondo l'algoritmo. Sapreste consigliarmene uno? non so proprio dove sbattere la testa -.-'
Cercando qualche informazione ho letto che molti consigliano di utilizzare il DFS (depth first search) "modificato"....ma non ho ancora capito quel "modificato" :P

Confido in voi matematici :D
Grazie in anticipo per l'aiuto.

Risposte
hamming_burst
Scusa per "polinomio cromatico" intendi il problema della "k-colorazione" di un grafo ?

Leggendo le condizioni del tuo problema o è una riduzione ad un altro problema, o è tutt'altro.

bytec0d3
"ham_burst":
Scusa per "polinomio cromatico" intendi il problema della "k-colorazione" di un grafo ?

Leggendo le condizioni del tuo problema o è una riduzione ad un altro problema, o è tutt'altro.


Ciao, a essere sincero non so se il problema della "k-colorazione" di un grafo sia la stessa cosa ma per polinomio cromatico intendo una funzione p(G,t) che da il numero di possibili "buone"colorazioni di un grafo; dove per "buone colorazioni" intendo ogni vertice del grafo deve avere un colore diverso dai propri vertici adiacenti.

In ogni caso il problema su cui mi sono bloccato è il trovare un algoritmo che mi permetta di elencare tutti i cicli all'interno di un generico grafo G....e fino ad ora non ho avuto successo :(

bytec0d3
up pls :(

hamming_burst
bhe la tua descrizione è esattamente la k-colorazione.
Ma il tuo problema come è descritto mi sembra una sua riduzione (riduzione dei problemi NP se conosci).

Se rimaniamo solo sulla tua richiesta, senza guardare le altre condizoni, si possono fare queste considerazioni:

- per essere un ciclo (per pignoleria sarebbe un "circuito semplice" per i grafi non orientati) deve avere almeno 3 nodi. Questo penso sia banale.
- un ciclo deve avere tutti nodi distinti tranne il primo=ultimo.
- un ciclo è un cammino con gli estremi uguali.

perciò si può fare una visita DFS con condizione di tenere in considerazione, che invece di eliminare i nodi già visitati, contare e poi eliminare.

Dal punto di vista algoritmico al momento non ho molta voglia, ma devi pensare prima a cosa fare poi pensi al come.

Se vuoi un algoritmo terra-terra, e guardi subito all'implementazione, io tempo fa pensai così: se usi una matrice di adiacenza, essendo simmetrica, puoi già subito lavorare lì, essendo che se esiste un ciclo sulle diagonali c'è tutto 1.
Se ricordo bene è così, basta che provi, se c'è un elenco di 1, c'è un ciclo. La complessità è alta tipo un $O(n^3)$ perciò non è il massimo :-)

intanto mi è venuto in mente questo, prova a pensarci, cmq domani guardo qualcosa di meglio è interessante questo problema, anche se è un problema conosciuto prova a googlare e vedrai :-)

dissonance
"bytec0d3":
up pls :(
[mod="dissonance"]Non fare UP prima di 24 ore dall'ultimo post. Vedi regolamento (clic) 3.4. In una stanza così poco affollata poi non c'è davvero nessuna ragione di comportarsi così.[/mod]

bytec0d3
Ciao ham_burst, prima di tutto grazie mille per l'interessamento :P
Allora ho cercando un po ma ho trovato sempre DFS applicato a grafi orientati e non riesco ad adattarlo ai non orientati.
Per quanto riguarda un algoritmo "alternativo" ne ho abbozzato uno...ma non è assolutamente il massimo! :D
Lo spiego con un esempio che faccio prima:

- Il grafo è rappresentato con una lista di adiacenza quindi ad esempio:

1 | 2 3
2 | 1 3 4
3 | 1 2
4 | 2

parto dal primo vertice e ragiono in questo modo:
- 1->2 ciclo={1,2}
- 2->1 non va bene perchè è il precedente, array rimane invariato ciclo={1,2}
- 2->3 non è già presente nell'array, quindi ok. ciclo={1,2,3}
- 3->1 1 non è il precedente ma sopratutto è il primo elemento dell'array. ciclo={1,2,3,1} array completato

- così facendo continuo a creare le altre combinazioni possibili e ad ogni array completato controllo che non sia già stato creato (stessi elementi ma posizioni diverse); così da avere, in questo esempio, le seguenti combinazioni:

1) {1,2,3,1} OK
2) {1,3,2,1} NO (già presente)
3) {2,1,3,2} NO (già presente)
4) {2,3,1,2} NO (già presente)
5) {2,4} NO (impossibile continuare dato che il vertice 4 è collegato solo al vertice 2)
6) {3,1,2,3} NO (già presente)
7) {3,2,1,3} NO (già presente)
8) {4,2} NO (impossibile continuare dato che il vertice 4 è collegato solo al vertice 2)

come vedi non è assolutamente un algoritmo "intelligente" ma sembra funzionare.... :(

@dissonance:
scusa, non avevo letto il regolamento :P

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.