我对数据结构和算法非常陌生,我们今天学习图,但是我不理解此代码,这就是代码,它用于查找图的深度:
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()
,但root
(root
为u
不变)所以我认为当打电话给depth_tree(graph, 0)
只是为了寻找0
的深处?
第二:为什么int max_d = depth_tree(graph, graph[root][0].id)
?像上面的例子一样,有1 2 3 4
???所以答案应该是4(错误,但我不明白)
任何人都请解释一下此代码逻辑,非常感谢,
答案 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;