LabASD - Visita in profondità (DFS)

Moreno Marzolla

Ultimo aggiornamento: 2024-04-17

DFS Demo

Realizzare l’algoritmo di visita in profondità (Depth-First Search, DFS) di un grafo orientato \(G=(V,E)\) con \(n\) nodi e \(m\) archi. Si chiede di realizzare la versione di DFS che esplora l’intero grafo e non solo la componente raggiungibile da un nodo sorgente dato. Cliccando sull’immagine in cima alla pagina è possibile vedere l’algoritmo DFS in azione (fonte).

La visita in profondità parte da ogni nodo non ancora esplorato \(v\), e percorre i cammini “il più a lungo possibile”. Si presti attenzione al fatto che la visita in profondità non trova i cammini di lunghezza massima. Per ogni nodo \(v\) viene calcolato l’istante discover[v] in cui il nodo viene incontrato per la prima volta, e l’istante finish[v] in cui tutti i nodi raggiungibili da \(v\) sono stati esplorati. Si avrà sempre che discover[v] < finish[v]. L’istante di apertura discover[v] del primo nodo visitato è 1, in conformità con lo pseudocodice visto a lezione.

Durante la visita ogni nodo viene colorato di bianco, grigio o nero. Tutti i nodi sono inizialmente bianchi, ad indicare che non sono ancora stati visitati. Un nodo raggiunto per la prima volta viene colorato di grigio; un nodo diventa nero quando sono stati esplorati tutti i nodi da esso raggiungibili.

L’algoritmo DFS può essere espresso sia in forma iterativa che ricorsiva. Tuttavia, consiglio di realizzare la versione ricorsiva perché è più semplice da scrivere.

Per compilare:

    gcc -std=c90 -Wall -Wpedantic graph.c dfs.c -o dfs

Per eseguire in ambiente Linux/MacOSX:

    ./dfs graph10.in

Per eseguire in ambiente Windows:

    .\dfs graph10.in

File