Il 0% ha trovato utile questo documento (0 voti)
14 visualizzazioni2 pagine

Usefull Algorithms

Il documento descrive diversi algoritmi per l'analisi dei grafi tra cui la ricerca in profondità e in larghezza, l'ordinamento topologico e la ricerca di cicli. Vengono fornite implementazioni di questi algoritmi in C++.

Caricato da

Francesco Carta
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato TXT, PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
14 visualizzazioni2 pagine

Usefull Algorithms

Il documento descrive diversi algoritmi per l'analisi dei grafi tra cui la ricerca in profondità e in larghezza, l'ordinamento topologico e la ricerca di cicli. Vengono fornite implementazioni di questi algoritmi in C++.

Caricato da

Francesco Carta
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato TXT, PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 2

//u = nodo di partenza, 0 va bene; time = variabile creata prima di richiamare, è

0; poi due vettori dt[N] e ft[N], vuoti; con N numero di nodi


bool hasCycleRec(int u, int &time, int *dt, int *ft){
time = time + 1;
dt[u] = time;
for(int v: grafo[u].adj){
if(dt[v] == 0){
if(hasCycleRec(v,time,dt,ft)) return true;
}
else if(dt[u]>dt[v] && ft[v] == 0) return true;
}
time = time + 1;
ft[u] = time;
return false;
}

//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);
}

//Breadth-First Search, restituisce un vettore con tutte le distanze più brevi di


tutti i nodi rispetto ad un nodo start, il vector si usa nel seguente modo:
//for(int i = 0; i<distance.size(); i++) cout << "distanza da: " << start << " a "
<< i << distance[i] << endl;
vector<int> bfs(int start) {
vector<int> distance(grafo.size, -1);
queue<int> q;
distance[start] = 0;
grafo[start].visited = true;
q.push(start);
while (!q.empty()) {
int v = q.front();
q.pop();
for (int u : grafo[v].adj) {
if (!grafo[u].visited) {
distance[u] = distance[v] + 1;
grafo[u].visited = true;
q.push(u);
}
}
return distance;
}

//Deep-First-Search funziona allo stesso modo, ma restituisce la distanza massima,


vector<int> distance
void dfs(int v, int dist = 0) {
grafo[v].visited = true;
distance[v] = dist;
for (int u : grafo[v].adj) {
if (!grafo[u].visited) {
dfs(u, dist + 1);
}
}
}

//se a questo aggiungo:


bool isConnected(){
dfs(1) //con 1 primo nodo del grafo
for(nodo &n : grafo) if(!n.visited) return false
return true;
}

Potrebbero piacerti anche