Sto provando a risolvere Appetito aracnide ma non riesco a implementare il fatto che un nodo possa essere rivisitato. Al momento senza nodi che si ripetono (anche se so che non è corretto) questa è il mio codice:
Faccio una dfs con backtracking per trovare un ciclo dispari
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimization ("unroll-loops")
using namespace std;
vector<vector<int>>V(30);
vector<int>path;
vector<bool>visit(30,false);
int dfs(int node){
if(node==0){
if(path.size()%2==0){ //la soluzione è pari se non contiamo il ritorno a 0
printf("%d\n",path.size()+1);
printf("0 ");
for(auto i:path)
printf("%d ",i);
printf("0 ");
return true;
}
return false;
}
visit[node]=true;
path.push_back(node);
for(auto next:V[node])
if(dfs(next))
return true;
visit[node]=false;
path.pop_back();
return false;
}
int main()
{
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int N,M;
cin>>N>>M;
for(int i=0;i<M;i++){
int x,y;
cin>>x>>y;
V[x].push_back(y);
V[y].push_back(x);
}
for(auto i:V[0]){
if(dfs(i))
return 0;
}
}
Prova a pensare in quanti modi diversi un nodo può essere utile. Se esaurisci tutti i modi non hai più bisogno di visitare di nuovo quel nodo.
Dovrebbe essere abbastanza intuitivo capire in quanti e in quali modi siccome stiamo badando alla parità della lunghezza del cammino (pari o dispari).
L’ho fatto tempo fa e non ricordo bene ma mi sembra che basti una DFS(nodo,indice) che oltre a marcare i dati come visitati li memorizzi in un array alla posizione indice:
supponendo una cosa del genere nella sequenza dei nodi : 0,3,4,9,8,20, e che ora si torni a 9.
Bene ci siamo:
il ciclo 9,8,20,9 è dispari ed il percorso è …
uso un array nodivis[] e nella DFS(nodo,indice) se nodo non è già stato visitato faccio nodivis[indice]=nodo; trovo il nodo successivo (succ) (se c’è) e chiamo DFS(succ,indice+1).
e se visito un nodo gia presente nell array vedo se esso ha un ciclo dispari formato dai nodi gia visitati e stampo i percorso inverso dal nodo gia visitato
Si puoi ma penso che, per verificare se il ciclo è di lunghezza dispari, sia più veloce tenere anche il conto delle distanze.
Anzi ho riguardato il codice e memorizzo anche quelle.