Задача в Т-Банк
Даны n комнат, пронумерованных от 0 до n - 1. Изначально все комнаты, кроме 0-ой, заперты. Ваша цель - посетить все комнаты. Однако, вы не можете посетить комнату, не имея ключа, открывающую её.
Когда вы посещаете комнату, вы можете найти какое-то множество различных ключей, используя которые, вы можете пройти в другие комнаты.
Для каждой комнаты вам известно, какие ключи в ней находятся. Вы должны ответить, можно ли посетить все n комнат, или нет
Решение:
Построим ориентированный граф, в котором вершинами будут комнатами, а ребро из u в v будет означать, что в комнате u есть ключ для комнаты v.
Таким образом, можно обойти граф обходом в глубину из вершины 0, пометить все вершины, куда можно добраться, и в конце проверить, помечены ли все вершины.
vector<char> used;
vector<vector<int>> g;
void dfs(int v) {
used[v] = true;
for (auto u : g[v])
if (!used[u])
dfs(u);
}
bool canVisitAllRooms(vector<vector<int>>& rooms) {
int n = (int)rooms.size();
used.resize(n);
g = rooms;
dfs(0);
for (int i = 0; i < n; ++i) {
if (!used[i])
return false;
}
return true;
}
Асимптотика O(N)
@algoses
Post #346
12.1K
- 🔥 9
- ❤ 4
- 😁 4
- 🙈 4
- 👍 2