¿Cómo se soluciona el problema de Little Red-Cap (TAP2013C) en SPOJ?

Has complicado innecesariamente un problema muy simple.

En primer lugar, tenga en cuenta que todos los bordes van de oeste a este. Así, implícitamente, se nos da el tipo topológico de un gráfico dirigido. Esto nos ahorra el trabajo de hacer un dfs. Ahora podemos resolver el problema usando programación dinámica

Defina dos cantidades para cada vértice u:

  • f (u) = número de caminos de u a N
  • g (u) = nivel máximo de alternativas para una ruta de u a N

El caso base para nuestra recurrencia será f (N) = g (N) = 1. Ahora, supongamos que hemos calculado f (v) yg (v) para todos v> u. Es fácil ver que f (u) = suma de f (v) para todos los v directamente accesibles desde u, contando la multiplicidad. Además, g (u) = f (u) + max (g (v)) para todos los v directamente accesibles desde u. Construir los valores de f y g para los vértices en orden decreciente será suficiente. g (1) es la respuesta final requerida.

Además, tenga en cuenta que no es necesario almacenar la multiplicidad de bordes por separado en un mapa. Es suficiente insertar entradas duplicadas en la lista de adyacencia. Esto asegurará que se agregue la multiplicidad mientras se calcula f pero no mientras se calcula g.

Finalmente, la solución es solo:

f[N]=g[N]=1; for(int i=N-1;i>0;i--) { for(int j=0;j<adjlist[i].size();j++) { f[i]+=f[adjlist[i][j]]; g[i]=max(g[i],g[adjlist[i][j]]); } g[i]+=f[i]; } return g[1];