Appetito aracnide 70/100

Ho cambiato il programma vedendo sia da ciò che mi hai mandato sia da altre richieste sullo stesso problema (soprattutto questo Aiuto Appetito aracnide (tecla) - n°13 da Alex0 ), però continua a darmi 3 errori (su casi diversi ora) dicendo che i nodi non esistano, continuo a non capirne il motivo essendo che gli unici valori che il mio vettore soluzione prende sono da adj e da valori già presenti nel vettore. Hai qualche idea di cosa possa causarmi questo problema?

#include <bits/stdc++.h>
#define MAXN 31
using namespace std;
vector<int> adj[MAXN];
int check=0;
int N,M;
int r;
int vis[MAXN];
int sol[200000];

void DFS(int s,int n){
	if(check==1) return;
	r=n;
	sol[n]=s;
	if(sol[n-2]==sol[n] && n>=2){
		if(adj[sol[n-1]].size()!=1) return;
	}
	if(vis[s]!=0){ //controlla se il nodo è gia stato visitato
		if((n-vis[s]+1)%2==0){ //in caso lo sia controlla se c'è un numero
//pari di nodi su cui si è passati tra i due nodi in questione, se c'è
			check=1; //imposta check =1 per uscire dalle funzioni
			int u=n+1; //u e c scriveranno copieranno tutti i nodi già visitati
// da indice n fino a 0 del vettore sol 
			int c=vis[s]-1;
			for(;c>=0;u++,c--){
				sol[u]=sol[c];
				r++; //r tiene conto di quante celle è composto sol
			}
			return;
		}
	}
	vis[s]=n;

	for(int i=0;i<adj[s].size();i++){
		if(adj[s][i]!=0)	DFS(adj[s][i],n+1);
	}
	
}

int main(void)
{ //la parte del main non l'ho modificata
	FILE *fr, *fw;
    fr = fopen("input.txt", "r");
    fw = fopen("output.txt", "w");
	int i,a,b;
	assert(2 == fscanf(fr, "%d%d", &N, &M));
	for(i=0;i<M;i++){
		assert(2 == fscanf(fr, "%d%d", &a, &b));
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	sol[0]=0;
	for(i=0;i<adj[0].size() && check==0;i++){
		DFS(adj[0][i],1);
	}
	fprintf(fw, "%d\n", r);
	for(i=0;i<=r;i++){
		
		fprintf(fw, "%d ", sol[i]);
	}
return 0;
}