Step 2: The length of the optimal path is given by V(start) (or U(end); they will be equal); from this calculate the threshold path length k=(1+p/100)*V(start) (paths with length greater than this you will not consider; paths with length less than this you want).
Step 3: Call f({start}, 0), where f(path_so_far, length_so_far) is defined,
function f(path_so_far, length_so_far){ PATHS = empty list; if(path_so_far.end == goal) Add path_so_far to PATHS and return PATHS. for each vertex n in neighbors_of(path_so_far.end) if(length_so_far + edge_cost(path_so_far.end, n) + V(n) < k) Add all paths returned by, f(path_so_far + n, length_so_far + edge_cost(path_so_far.end, n)) to PATHS. // (Above, by "paths_so_far + n" I mean the // path consisting of paths_so_far with the // vertex n added to the end.) return PATHS}
This will give you all of the paths you want.