Usefull Algorithms
Usefull Algorithms
//el è un nodo, si usa dentro i cicli for con i, del tipo: for(i = 0; i<N; i++)
if(!grafo[i].visited) dfs(i); è generica per visitare qualsiasi grafo, molto utile
void visit(int el){
grafo[el].visited = true;
for(int v: grafo[el].adj) if(!grafo[v].visited) ts_dfs(v);
}
//questa variante carica il nodo in uno stack, ordinamento topologico, tecnica che
si usa nei DAG, per ogni arco (u,v) nello stack u viene prima di v
void ts_dfs(int el){
grafo[el].visited = true;
for(int v: grafo[el].adj) if(!grafo[v].visited) ts_dfs(v);
ordine.push(el);
}
//si usa nei DAG ordinati topologicamente, restituisce il numero minimo di sessioni
necessarie per percorrere tutto il grafo, quindi per completare le foglie
int minSessions(){
vector<int> dist(grafo.size());
for(int i = 0; i<dist.size(); i++) dist[i] = 0; //inizializzo tutto il vettore
a 0
while(!ordine.empty()){
int u = ordine.top();
ordine.pop();
for(int v: grafo[u].adj) dist[v] = max(dist[v],dist[u]+1); //scelgo il
massimo tra il nodo v e il nodo u+1
}
return *max_element(dist.begin(), dist.end()+1);
}