UVa 10917

Summary

Given an undirected graph, find the number of paths from node 1 to node 2, subject to the constraint that an edge from node A to node B may only be followed if there is any path from B to 2 that is shorter than all possible routes from A to 2.

Explanation

The constraint sounds unwieldy, but in fact, if there is any path from B to 2 that is shorter than all routes from A to 2, then the shortest path will be it.

Start by running any single-source shortest path algorithm from node 2, the end state. (Dijkstra's Algorithm will do.) Then, figure out which edges can be taken. If D(A) represents the shortest path from A to 2, then an edge from A to B can be taken only if D(A) > D(B). If we consider only those edges that can be traversed at all, we end up with a directed acyclic graph. This strongly suggests that we perform a topological sort on the new graph.

At this point, all that remains to be done is a relatively straightforward DP/memoization, to discover the number of paths that start at 1 and end at 2.

Optimizations

None are really needed - the number of nodes is at most N and there is at most one (undirected) edge between any two nodes. The above algorithm requires $O(N^{2})$ for a naive implementation of Dijkstra's, $O(N^{2})$ for the creation of the DAG, $O(V+E)=O(N^{2})$ for the topological sort, and another $O(N^{2})$ for the DP, for a total quadratic running time. This should have no problems running in time.

5 6
1 3 2
1 4 2
3 4 3
1 5 12
4 2 34
5 2 24
7 8
1 3 1
1 4 1
3 7 1
7 4 1
7 5 1
6 7 1
5 2 1
6 2 1
0

2
4