Editorial for IOI '95 P5 - Street Race


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

The data structure for a course is as follows:

CONST Max_Arrows = 100;
VAR number_of_points,number_of_arrows : INTEGER;
    Arrows : ARRAY [0..Max_Arrows-1,0..1] OF INTEGER;

The number of the start point is 0, the number of the finish point is \text{number_of_points}-1. The i^\text{th} arrow (0 \le i \le \text{number_of_arrows}-1) goes from the point with number Arrows[i,0] to the point with number Arrows[i,1].

The data structure for the solution of the task is as follows:

CONST Max_points = 50;
TYPE Point_array = ARRAY [0..Max_points-1] OF BOOLEAN;
VAR number_unavoidable_points,number_splitting_points : INTEGER;
    unavoidable,splitting : Point_array;

number_unavoidable_points is the number of unavoidable points (apart from the start point and the finish point). number_splitting_points is the number of splitting points. unavoidable[N] is TRUE iff the point with number N is an unavoidable point. splitting[N] is TRUE iff the point with number N is a splitting point.

The main body of the program is:

BEGIN
  initialisation;
  read_input;
  compute_results;
  write_output;
  finalisation;
END.

The procedure initialisation initialises the variables mentioned above and file variables for input and output. The procedure read_input reads the input; the variables of the data structure for the course receive their final value. The procedure compute_results computes the results; the variables of the data structure for the solution of the task receive their final value. The procedure write_output writes the output to the appropriate file. The procedure finalisation closes the files.

We will only consider the procedure compute_results from here, as the implementation of the other procedures is straightforward.

The procedure compute_results determines for each point (except start point and finish point) whether it is an unavoidable point, and if so, whether it is a splitting point (Note that each splitting point is an unavoidable point as well).

To determine whether current_point is an unavoidable point, determine the set S of all points which can be reached from the start point via a path which does not contain current_point. Obviously, current_point is an unavoidable point iff the finish point is not in S.

S is determined by calling the procedure find_reachable with current_point as the argument. The result is stored in the Point_array reachable. After the call find_reachable(current_point), the value of reachable[N] is TRUE iff point N can be reached from the start point via a path which does not contain current_point. By definition, reachable[current_point] is FALSE. Careful analysis now shows that current_point is a splitting point iff there is no arrow from a point P with reachable[P] = FALSE to a point Q with reachable[Q] = TRUE. This can be checked by a function.


Comments

There are no comments at the moment.