题目描述
某文件系统中有 N 个目录,每个目录都一个独一无二的 ID。
每个目录只有一个父目录,但每个目录下可以有零个或多个子目录,目录结构呈树状结构。
假设 根目录的 ID 为0,且根目录没有父目录。
其他目录ID 用唯一的正整数表示,并统一编号。
现给定目录 ID 和其父目录 ID 的对应父子关系表 [子目录ID,父目录ID],以及一个待删除的目录 ID, 请计算并返回一个 ID 序列, 表示因为删除指定目录后剩下的所有目录, 返回的 ID 序列以递增序输出
注意:
- 被删除的目录或文件编号一定在输入的 ID 序列中;
- 当一个目录删除时,它所有的子目录都会被删除。
输入描述
输入的第一行为父子关系表的长度 m;
接下来的 m 行为 m 个父子关系对;
最后一行为待删除的 ID。
序列中的元素以空格分割。
输出描述
输出一个序列,表示因为删除指定目录后,剩余的目录 ID。
用例
# in
5
8 6
10 8
6 0
20 8
2 6
8
#out
2 6
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
map<int, vector<int>>tree;
int id;
vector<int> res;
void dfs(int cur)
{
if (tree.find(cur) == tree.end()) return; // 当前节点是否在树中
for (const auto& it : tree[cur])
{
if (it != id) {
res.emplace_back(it);
dfs(it);
}
}
}
int main()
{
int m;
cin >> m;
for (int i = 0; i < m; i++)
{
int son, fa;
cin >> son >> fa;
tree[fa].emplace_back(son);
}
cin >> id;
if (id != 0)
{
dfs(0);
}
sort(res.begin(), res.end());
for (const auto& id : res) {
cout << id << " ";
}
return 0;
}