Please submit your code in C++20/23.
If all the parts of the ship of Theseus are replaced one by one over time, at what point − if any − does it stop being the same ship?
When he's not pondering deeply into the abstract, Theseus slays minotaurs in his spare time. This time however, he must first pass through a dark and twisted labyrinth. Since this is no easy feat, he asks the help of Ariadne to guide him. The labyrinth can be seen as a connected undirected graph with nodes (labelled from to ) and edges, with a special node , where the Minotaur sits.
Theseus cannot see the graph at all, but Ariadne can. She and Theseus will devise a strategy so that he can safely reach the node where the Minotaur is: she will put a label with either or on each of the edges. After this, Theseus will enter the labyrinth through a node that Ariadne doesn't know beforehand.
Since it's very dark, at any moment in time he can only see the index of the node he's in, the indices of neighbouring nodes, and the labels of the adjacent edges. Also, because of the twisted nature of the labyrinth, he can never recall any information regarding previous nodes he has visited.
To reach the Minotaur safely, Theseus must move at most times, where is the minimum number of edges on the path from to , and is a constant.
You will have to implement two functions:
std::vector<int> label(int n, std::vector<std::pair<int,int>> edges, int t);
int travel(int n, int u, std::vector<std::pair<int,int>> neighbours);
Attention! The program should not use global/static variables to communicate between different instances of label or travel. Any attempt to circumvent this would lead to undefined behaviour.
Consider we have a graph with nodes and edges (listed below). The start node will be (marked with green) and the destination node is (marked with red). The grader will first call:
label(7, {{1, 6}, {7, 6}, {2, 5}, {3, 2}, {3, 6}, {6, 5}, {6, 4}}, 7)
Let's assume the call to label returns {0, 1, 1, 1, 0, 1, 0}. Then the resulting graph will look like this:
:::align{center}
:::
What follows is a possible sequence of calls to travel that will lead to a correct solution:
| Call | Returned value |
|---|---|
travel(7, 3, {{2, 1}, {6, 0}}) |
|
travel(7, 2, {{5, 1}, {3, 1}}) |
|
travel(7, 5, {{6, 1}, {2, 1}}) |
|
travel(7, 6, {{3, 0}, {5, 1}, {1, 0}, {4, 0}, {7, 1}}) |
|
travel(7, 4, {{6, 0}}) |
|
travel(7, 6, {{3, 0}, {5, 1}, {1, 0}, {4, 0}, {7, 1}}) |
When the returned value is (i.e. the destination), the program stops.
Note: A ladder graph is a graph consisting of two parallel paths (or chains) of the same length, with each pair of corresponding nodes connected by an edge, forming the rungs of the ladder. Additionally, at one end of the ladder, there is a special node – the destination node – which is connected to both endpoints of the ladder, effectively acting as a common parent. It is guaranteed that will be odd for any such graph. See the image below.
:::align{center}
:::align