Salve a tutti,
Sto cercando di risolvere questo problema…senza troppo successo,temo proprio di aver bisogno del vostro aiuto!
La soluzione da me proposta è così strutturata:
ho costruito questa struct
struct st{vector gr;
int c,f;
bool t;
bool s;
st():t(false),s(false),gr(),c(1000000000),f(0){}
};
il vector gr serve a costruire il grafo,l’intero c a memorizzare il costo,l’intero f a memorizzare il padre di ciascun nodo. Bool t indica se è presente una telecamera o meno.
Ho costruito un vettore del tipo di questa struct. Successivamente ho dichiarato 4 vector: 2 servivano per fare visite in ampiezza, uno per memorizzare temporaneamente le foglie di un sottoalbero, uno per la soluzione finale.
Durante la prima visita, scendo dal nodo uno ed ogni volta che trovo una foglia, confronto la somma dei costi delle foglie coi costi del nodo padre. Salvo il padre o le foglie nella soluzione, salvo il nonno nell’altro vector per la visita in ampiezza e vado avanti.
Nella seconda visita,risalgo dai nonni. Controllo se almeno uno tra i figli e i padri di questi nonni contiene una telecamera,altrimenti la metto dove il costo è minimo. Poi metto il padre del nonno in coda al vector se non lo avevo già inserito e se il nonno non è il nodo 1.
Il caso d’esempio è corretto e rispetta la soluzione prevista su carta.
questo è il codice delle 2 visite. I vector si chiamano pila e coda, ma solo per aver 2 nomi diversi
1° visita:
while(!pila.empty())
{temp=pila[0];
pila.erase(pila.begin());
te=0;
for(i=0;i<V[temp].gr.size();i++)
{if(V[temp].gr[i]!=V[temp].f)
{V[V[temp].gr[i]].f=temp;
pila.push_back(V[temp].gr[i]);
if(V[V[temp].gr[i]].gr.size()==1)
{tem.push_back(V[temp].gr[i]);
te=te+V[V[temp].gr[i]].c;
}
}
}
if(te!=0)
{if(te<V[temp].c)
while(!tem.empty())
{sol.push_back(tem.front());
V[tem.front()].t=true;
tem.erase(tem.begin());
}
else
{sol.push_back(temp);
V[temp].t=true;
tem.clear();
}
if(temp!=1)
{coda.push_back(V[temp].f);
V[V[temp].f].s=true;
}
}
}
2° visita:
while(!coda.empty())
{temp=coda.front();
coda.erase(coda.begin());
min=temp;
te=V[temp].c;
for(i=0;i<V[temp].gr.size();i++)
{if(V[V[temp].gr[i]].t==true)
{ko=true;
break;
}
if(V[V[temp].gr[i]].c<te)
{te=V[V[temp].gr[i]].c;
min=V[temp].gr[i];
}
}
if(ko==false)
{sol.push_back(min);
V[min].t=true;
}
if(V[V[temp].f].s!=true&&temp!=1)
{coda.push_back(V[temp].f);
V[V[temp].f].s=true;
}
}
Grazie in anticipo!