c++ - 在树中删除但只有一些节点

标签 c++ algorithm graph tree

/image/JAz2M.png

这就是问题所在。 我写了代码。但不知何故无法通过所有测试用例。我生成的所有测试用例都是真实的。你能告诉我为什么我会弄错吗?

给定一个包含 N 个目录/文件夹的目录树。每个目录都由一个从 1 到 N 的特定值表示。根目录的 id 是 1,然后它有一些子目录,这些目录可能包含其他一些,然后继续。现在您已获得要删除的目录 ID 列表,您需要找到需要删除的最小目录数,以便删除给定列表中的所有目录。

vector<vector<int> > adj;
vector<bool> del;
vector<bool> col;
void Final(int a, bool val)
{
    col[a] = val;
    if (del[a])
        val = del[a];
    for (int i = 0; i < adj[a].size(); i++) {
        Final(adj[a][i], val);
    }
    return;
}
int main()
{
    int n;
    cin >> n;
    adj.resize(n + 1);
    adj.clear();
    for (int i = 1; i <= n; i++) {
        int a;
        cin >> a;
        adj[a].push_back(i);
    }
    int q;
    cin >> q;
    if (q <= 1) {
        cout << q << endl;
        return 0;
    }
    del.resize(n + 1);
    col.resize(n + 1);
    del.clear();
    col.clear();
    for (int i = 0; i <= n; i++) {
        col[i] = false;
        del[i] = false;
    }
    for (int i = 0; i < q; i++) {
        int a;
        cin >> a;
        del[a] = true;
    }
    if (del[1]) {
        cout << "1" << endl;
        return 0;
    }
    else {
        Final(1, false);
        int final = q;
        for (int i = 1; i <= n; i++) {
            if (del[i] && col[i])
                final--;
        }
        cout << final << " ";
    }
}

最佳答案

使用 DFS!

如果根被标记为“待删除”返回 1,(这是最好的情况,你做的工作最少)。否则,递归到根的每个子节点,并将它们相加以了解要删除的节点数。不变量是:如果一个节点要被删除,不要再往下撤回子树(因为任何以这个子树为根的东西都会消失)

这是一些伪代码

DFS(root)
    if(root is to be deleted)
        return 1
    else 
        number_of_nodes_to_delete = 0;
        for every child c of root
            number_of_nodes_to_delete += DFS(c)
        return number_of_nodes_to_delete;

您显然有正确的想法将树表示为邻接表 vector<vector<int>> .

作为次要细节,将邻接列表作为 const& 传递进入递归。这样可以节省复印时间。 (DFS(int root, const vector<vector<int>>& adjList 可能是一个有用的函数签名)。

关于c++ - 在树中删除但只有一些节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559847/

相关文章:

C++使用仿函数将函数传递给函数

c - 查找出现在数组一半以上元素中的常量

git - 让 git log --graph --all 像 hg glog 一样显示当前位置

自动排列实体关系图的算法

c++ - 升压信号连接管理

c++ - 是否可以全局挂接窗口的创建,以便我可以控制窗口在屏幕上的放置位置?

c# - 如何将 vector<int> 从 C++ dll 编码到 C# 应用程序?

algorithm - 如何找到给定数字的所有数字的排列,使其最接近目标数字

c++ - 在排序和旋转的数组中搜索

graph - 绘制流网络的软件