对图算法的查找深度感到好奇

时间:2018-11-06 14:53:50

标签: c++ graph-theory

我对数据结构和算法非常陌生,我们今天学习图,但是我不理解此代码,这就是代码,它用于查找图的深度:

struct Node {
    int id;
    int weight;

    Node(int id_, int weight_)
    {
        id = id_;
        weight = weight_;
    }
};

int depth_tree(vector<Node> graph[], int root)
{
    if (graph[root].size() == 0) {
        return 0;
    } else {
        int max_d = depth_tree(graph, graph[root][0].id);
        for (int i = 1; i < graph[root].size(); i++) {
            int d = depth_tree(graph, graph[root][i].id);
            if (d > max_d) {
                max_d = d;
            }
        }
        return max_d + 1;
    }
}

int main()
{
    int n;
    cin >> n;
    vector<Node> graph[n];

    int u, v;
    for (int i = 0; i < n - 1; i++) {
        cin >> u >> v;
        Node temp_uv(v, 0);
        graph[u].push_back(temp_uv);
    }

    cout << depth_tree(graph, 0);

}

我不明白两点:

第一:在计算深度int max_d = depth_tree(graph, graph[root][0].id时,我理解它表示它采用root节点的[0]元素的ID 例如当输入

5
0 1
0 2
1 3
3 4

u中输入时max_d将为1,并且0必须为main(),但rootrootu不变)所以我认为当打电话给depth_tree(graph, 0)只是为了寻找0的深处?

第二:为什么int max_d = depth_tree(graph, graph[root][0].id)?像上面的例子一样,有1 2 3 4 ???所以答案应该是4(错误,但我不明白)

任何人都请解释一下此代码逻辑,非常感谢,

1 个答案:

答案 0 :(得分:0)

首先定义单词深度:节点的深度是从节点到树的根节点的边数。

找到最大深度的主要想法是将问题切成较小的一个。

最简单的问题是:叶根节点的深度是多少?那么它是0,因为在叶子下面没有子级,因此您无法遍历任何边。

if (graph[root].size() == 0) { // here root only means the current node
    return 0;

接下来,我们问:不是叶子的节点的深度是多少?好吧,这取决于孩子们的深度。这里的算法寻找最大深度,因此我们需要寻找孩子的最大深度。

int max_d = depth_tree(..., ...[0]...);

for (int i = 1; i < graph[root].size(); i++) {

    // the loop starts at 1 because 0 is the highest depth so far

    int d = depth_tree(..., ...[i]...);

    if (d > max_d) { // if the new child is deeper

       // then this is the new max depth

       max_d = d;
    }
}

一旦我们知道了这一点,并且由于在子节点和当前节点之间存在一条边,我们就添加1。

return max_d + 1;