Greedy Approach
Remark 1. The animal that crossed the meadow last can be deduced directly from the input: it is simply the animal that left the topmost tracks in the upper left (or, alternatively, lower right) corner.
Remark 2. In an optimal solution (using the minimum number of animals), no two animals of the same type will cross the meadow directly after each other.
Proof. We could simply merge the two paths (go along the first one from the upper left to the lower right corner, return on the same way and take the second path down) to get a new one, thereby reducing the number of animals used. 
In any step, the current animal can visit all the cells reachable from the lower left corner using only already visited cells and cells containing his respective tracks. Now consider the following greedy algorithm: at any step, we simply visit all reachable cells, as long as there are unvisited cells (this algorithm processes the animals in reverse order). Note that the animal we choose at each step is given by the remarks above.
Proposition 3. The described algorithm is correct and uses the minimum number of animals possible.
Proof. We can clearly visit all those cells and since there is a way from source to target completely covered with tracks from the last animal, we can simply go back to the source and follow that way. Thus the result of the algorithm corresponds to a legal set of animal moves.
We now show by induction that, for any
, after having used
animals we have visited all the cells possible. The case
follows by definition. Now assume
. Let
be the set of all cells that could be reached by using
animals but isn't visited by the above algorithm using only
animals. If
we're finished. Otherwise, take the cell
with the minimum distance to the upper left corner (measured in the minimum number of cells on any valid path to this cell). Then by choice, all other cells on this path are visited by our algorithm. If the cell considered were reachable by less than
animals, we would have already visited it. So according to the remarks above, the topmost track on the cell is the same we are currently considering in our algorithm, so our algorithm will visit it contradicting the choice of
. So
is indeed empty and thus our algorithm is indeed optimal. 
A simple way to implement this algorithm is to set all cells visited so far to a special "Don't care" character (e.g. *
). This algorithm needs
steps for an
meadow and suffices for the first subtask. The figure below shows that there are indeed up to
animals needed.
Linear solution
Remove from the graph considered before all edges between cells with different topmost tracks. Now we can contract all those components to single nodes and add the deleted edges thereby obtaining a new graph
. For simplicity, number the nodes from
to
where node
represents the component containing the upper left corner.
Figure 1: An example of tracks, the respective graph and a possible breadth-first-tree
This graph is clearly bipartite with a bicoloring given by the assignment component
topmost track. Consider the breadth-first tree
(starting at node
). Note that both
and
can be calculated in time
.
Proposition 4. The minimum number
of animals needed to create the given pattern equals the depth of
, i.e.
.
Proof. We show by induction that the cells visited by the previously described greedy algorithm after using
animals are exactly the cells represented by the nodes within distance
from the root. Again the case
is trivial. For
we can visit all the nodes "in the layer below": since we have
, the bicoloring of
gives a bicoloring of
and thus all the nodes in the next layer have the same, namely the currently active, color, and are visited by the greedy algorithm.
Furthermore, the greedy algorithm doesn't reach any other nodes: the nodes visited so far are the previous layers. Assume component
can be visited and take any path from the root to
and throw away all the parts up to the last node that is already visited. The remaining nodes have to be of the currently active color, i.e. they belong to the component
. Thus if
hasn't been visited before, it is a child of a node visited before and will be visited in this step. 
This suffices for an
solution (i.e. linear in the size of the input). However, instead of explicitly calculating components, one can assign weights to all the edges in the original graph: any edge between two nodes of the same color gets weight
and any other edge weight
. Then clearly the maximum distance of any node to the root (the upper left corner) equals
. The distances can be calculated by Dijkstra's algorithm where we can use a deque
instead of a priority_queue
(
-Dijkstra) to achieve a linear running time.
Comments