41. 目录删除

148 阅读1分钟

题目描述

某文件系统中有 N 个目录,每个目录都一个独一无二的 ID。

每个目录只有一个父目录,但每个目录下可以有零个或多个子目录,目录结构呈树状结构。

假设 根目录的 ID 为0,且根目录没有父目录。 其他目录ID 用唯一的正整数表示,并统一编号。

现给定目录 ID 和其父目录 ID 的对应父子关系表 [子目录ID,父目录ID],以及一个待删除的目录 ID, 请计算并返回一个 ID 序列, 表示因为删除指定目录后剩下的所有目录, 返回的 ID 序列以递增序输出

注意:

  1. 被删除的目录或文件编号一定在输入的 ID 序列中;
  2. 当一个目录删除时,它所有的子目录都会被删除。

输入描述

输入的第一行为父子关系表的长度 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;
}