È possibile trovare tutti i percorsi utilizzando DFS come | Vlad descritto. Per trovare quali nodi compaiono in ogni percorso, puoi semplicemente mantenere una matrice di booleani che dice se ogni nodo è apparso in ogni percorso fino a quel momento. Quando il DFS trova un percorso, passare attraverso ogni vertice non nel percorso e impostare il valore dell'array corrispondente su falso. Quando hai finito, solo i vertici con valori di true saranno quelli che appaiono in ogni percorso.
Pseudocodice:
int source;
int sink;
int nVerts;
bool inAllPaths[nVerts]; // init to all true
bool visited[nVerts]; // init to all false
stack<int> path; // init empty
bool dfs(int u)
if (visited[u])
return;
if (u == sink)
for i = 0 to nVerts-1
if !stack.contains(i)
inAllPaths[i] = false;
return true;
else
visited[u] = true;
stack.push(u);
foreach edge (u, v)
dfs(v);
stack.pop();
visited[u] = false;
return false;
main()
dfs(source);
// inAllPaths contains true at vertices that exist in all paths
// from source to sink.
Tuttavia, questo algoritmo non è molto efficiente. Ad esempio, in un grafico completo di n vertici (tutti i vertici hanno contorni a tutti gli altri) il numero di percorsi sarà n! (n factorial).
Un algoritmo migliore sarebbe quello di verificare l'esistenza in ogni percorso di ogni vertice separatamente. Per ogni vertice, cerca di trovare un percorso dalla sorgente al sink senza andare in quel vertice. Se non riesci a trovarne uno, è perché il vertice appare in ogni percorso.
Pseudocodice:
// Using the same initialisation as above, but with a slight modification
// to dfs: change the foreach loop to
foreach edge (u, v)
if (dfs(v))
return true; // exit as soon as we find a path
main()
for i = 0 to nVerts-1
set all visited to false;
if (inAllPaths[i])
visited[i] = true;
if (dfs(source))
inAllPaths[i] = false;
visited[i] = false;
Purtroppo, questo ha ancora caso peggiore esponenziale durante la ricerca di un percorso. Puoi sistemarlo cambiando la ricerca in una ricerca in ampiezza. Se non sbaglio, questo dovrebbe darti prestazioni O (VE).
fonte
2010-06-17 07:03:24
Compiti? Cosa hai provato fino ad ora? – user85509
non ci sarà un numero infinito di percorsi se il grafico è ciclico? – jalf
@jalf, l'ho pensato anch'io, ma Wikipedia dice che c'è qualche disaccordo. "Un percorso senza vertici ripetuti è chiamato un percorso semplice, e un ciclo senza vertici o bordi ripetuti a parte la ripetizione necessaria del vertice di inizio e di fine è un semplice ciclo. Nella teoria dei grafi moderni, il più delle volte" semplice "è implicito cioè, "ciclo" significa "ciclo semplice" e "percorso" significa "percorso semplice", ma questa convenzione non è sempre osservata, specialmente nella teoria dei grafi applicata ". –