Puede encontrar todas las rutas utilizando DFS como describió Vlad. Para encontrar qué nodos aparecen en cada ruta, puede mantener una matriz de booleanos que indique si cada nodo ha aparecido en cada ruta hasta el momento. Cuando su DFS encuentre una ruta, pase por cada vértice no en la ruta y establezca el valor de matriz correspondiente en falso. Cuando hayas terminado, solo los vértices con valores de verdadero serán los que aparezcan en cada ruta.
Pseudocódigo:
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.
Sin embargo, este algoritmo no es muy eficiente. Por ejemplo, en un gráfico completo de n vértices (todos los vértices tienen bordes para todos los demás), el número de caminos será n. (n factorial).
Un mejor algoritmo sería verificar la existencia en cada camino de cada vértice por separado. Para cada vértice, intente encontrar una ruta desde la fuente al receptor sin tener que ir a ese vértice. Si no puede encontrar uno, es porque el vértice aparece en todos los caminos.
Pseudocódigo:
// 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;
Desafortunadamente, esto todavía tiene exponencial peor de los casos en la búsqueda de un camino. Puede solucionar esto cambiando la búsqueda a una búsqueda amplia. Si no me equivoco, esto debería darte el rendimiento O (VE).
¿Tarea? ¿Qué has intentado hasta ahora? – user85509
¿no habrá un número infinito de rutas si el gráfico es cíclico? – jalf
@jalf, yo también lo pensé, pero Wikipedia dice que hay algún desacuerdo. "Un camino sin vértices repetidos se llama un camino simple, y un ciclo sin vértices o aristas repetidos aparte de la repetición necesaria del vértice de inicio y fin es un ciclo simple. En la teoría de grafos moderna, lo más frecuente es que esté implícito 'simple' es decir, "ciclo" significa "ciclo simple" y "camino" significa "camino simple", pero esta convención no siempre se observa, especialmente en la teoría de los gráficos aplicados ". –