applicando l’algoritmo “tour euleriano” questo problema totalizza 40/100. E’ l’algoritmo sbagliato oppure è sbagliata la mia soluzione? ho provato e riprovato più volte ma molti dei casi test risultano con “Arco inesistente” dove sbaglio?
Non riesco proprio a capire dove sbaglio, eppure l’algoritmo dovrebbe essere quello (viene anche suggerito dalle assunzioni), è possibile che nelle soluzioni del correttore manchino cammini possibili?
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<list>
using namespace std;int n,m,a,b;
int temp,temp1;
list<int>lista[200001];
stack<int>pila;
int grado[200001];
int fine;
int risultato[2000000];void controlla(int att){
<b>if</b>(grado[att]==0){ fine++; risultato[fine]=att; <b>if</b>(!pila.empty()){ <b>int</b> prossimo=pila.top(); pila.pop(); controlla(prossimo); } <b>return</b>; } <b>else</b>{ <b>for</b>(list<<b>int</b>>::iterator i=lista[att].begin();i==lista[att].begin();i=i){ lista[*i].remove(att); lista[att].remove(*i); grado[att]--; grado[*i]--; pila.push(att); controlla(*i); } } }
int main(){
FILE *in,*out;
in=fopen(“input.txt”,“r”);
fscanf(in,"%d %d %d %d",&n,&m,&a,&b);
for(int i=1;i<=m;i++){
fscanf(in,"%d %d",&temp,&temp1);
lista[temp].push_back(temp1);
lista[temp1].push_back(temp);
grado[temp]++;
grado[temp1]++;
}
fclose(in);
//fine input
pila.push(a);
controlla(a);
//fine controllo;
out=fopen(“output.txt”,“w”);
for(int i=m+1;i>1;i–)
fprintf(out,"%d %d\n",risultato[i],risultato[i-1]);
fclose(out);
//fine outputreturn 0;
}
P.s non badate tanto alla riga
for(list<int>::iterator i=lista[att].begin();i==lista[att].begin();i=i){
non riuscivo proprio ad estrarre il primo elemento da una lista perciò ho fatto quella cosa bruttissima :P
Non riesco a capire qual’è lo scopo del tuo algoritmo xD
Comunque non c’è bisogno di scomodare le list, bastano i vector!
E un’altra cosa: non è necessaria la pila, in quanto “esiste” già la ricorsiva che crea di suo uno stack!