Non riesco proprio a fare piu’ di 30 punti su police2, c’e’ qualche ottimizzazione che mi sfugge?
Mi vanno fuori tempo i subtask 3, 4 e 6.
Per ora il codice che uso e’ il seguente:
Il problema è che facendo partire una dfs per ogni nodo ottieni un algoritmo O(N^2) che quindi non paassa i testcase grandi.
Prova a capire come potresti esplorare il grafo in un solo passaggio riuscendo a trovare i cicli e anche riuscire a capire se stai entrando in un nuovo ciclo mai esplorato o uno esplorato in precedenza (per non contare i cicli già contati più volte).
Ciao! Inanzitutto grazie per la risposta, avevo provato il seguente codice per evitare di ripartire da un nodo gia’ visitato ma va comunque fuori tempo, dovrei usare il graph coloring?
( ho fatto un casino col messaggio di prima sorry )
sì esatto il concetto è salvarsi per ogni nodo a quale percorso appartiene, e anche in che posizione sei nel percorso attuale, per calcolarti la lunghezza dell’eventuale ciclo.
io l’ho pensata così:
numero_percorso = 0
posizione_percorso = 0
per ogni nodo n (indice i):
se n è già visitato:
salta
numero_percorso += 1
partenza = i
arrivo = i
// seguo il percorso finchè non finisce o entro in un ciclo
loop infinito:
se arrivo non è visitato:
segna arrivo come visitato
salva numero_percorso e posizione_percorso per il nodo arrivo
partenza = arrivo
arrivo = prossimo nodo // esempio arrivo=g[arrivo];
se l'arrivo è visitato e numero_percorso è uguale a quello dell'arrivo: // entro in un loop nuovo
lunghezza_ciclo = posizione_percorso(partenza)-posizione_percorso(arrivo)+1
salva la lunghezza massima
esci dal loop infinito
se l'arrivo è visitato ma numero_percorso è diverso: //sono entrato in un loop già contato
esci dal loop infinito
posizione_percorso += 1