Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stack>
- #include <vector>
- using namespace std;
- vector<vector<size_t>> tree;
- vector<stack<size_t>> stackTmp;
- vector<size_t> colors, result;
- // Реализация алгоритма описанного в документе
- // -1 - нет соседа под условие
- void taskDfs(const size_t& v)
- {
- const int currentColor = colors[v];
- result[v] = stackTmp[currentColor].empty() ? -1 : stackTmp[currentColor].top();
- stackTmp[currentColor].push(v);
- for (size_t i = 0; i < tree[v].size(); i++)
- {
- taskDfs(tree[v][i]);
- }
- stackTmp[currentColor].pop();
- }
- int main()
- {
- size_t n, c, tmp;
- // Считываем начальные данные
- cin >> n >> c;
- tree.resize(n + 1);
- // Потом считываем 2 строку
- for (size_t i = 2; i <= n; i++)
- {
- cin >> tmp;
- tree[tmp].push_back(i);
- }
- colors.resize(n + 1);
- // Потом считываем 3 строку
- for (size_t i = 1; i <= n; i++)
- {
- cin >> colors[i];
- }
- stackTmp.resize(c + 1);
- result.resize(n + 1);
- // Запускаем наш метод
- taskDfs(1);
- // Выводим результат
- cout << endl << "Results:" << endl;
- for (size_t i = 1; i <= n; i++)
- {
- cout << result[i] << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement