C语言完成以下代码:选取不同的结点当作树根可以构造不同树高的树,选取编号最小的结点,使得以该结点为树根的树的高度最大。输入 输入数据的第一行为一个整数N (2<=N<=100,000),表示树的结点数量,结点编号分别为1,2,3,…,N。之后有N-1行,每行有两个整数A和B,表示A结点和B结点之间有一条边。输入数据保证可以构造出一棵有根树。 有多组测试数据,输入以EOF结束。 输出 输出两个整数minNode和Hight,表示以编号minNode为树根的树的最大高度为Hight,如果存在多种情况使得高度Hight最大,输出编号最小的minNode。
时间: 2024-02-09 07:08:00 浏览: 172
以下是C语言实现代码:
```c
#include <stdio.h>
#define MAXN 100005
int head[MAXN], nxt[MAXN << 1], ver[MAXN << 1], tot = 0;
int dep[MAXN], maxdep = 0, ans = MAXN;
void add(int x, int y) {
ver[++tot] = y;
nxt[tot] = head[x];
head[x] = tot;
}
void dfs(int u, int fa, int d) {
dep[u] = d;
if (dep[u] > maxdep || (dep[u] == maxdep && u < ans)) {
maxdep = dep[u];
ans = u;
}
for (int i = head[u]; i; i = nxt[i]) {
int v = ver[i];
if (v != fa) {
dfs(v, u, d + 1);
}
}
}
int main() {
int n, a, b;
while (~scanf("%d", &n)) {
tot = 0;
maxdep = 0;
ans = MAXN;
for (int i = 1; i < n; ++i) {
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
dfs(1, 0, 1);
maxdep = 0;
dfs(ans, 0, 1);
printf("%d %d\n", ans, maxdep - 1);
}
return 0;
}
```
代码思路:
首先通过邻接表存储树的结构,然后进行两次 DFS,第一次 DFS 找到以任意一个节点为根的树的最大深度以及对应的根节点编号,第二次 DFS 在以第一次得到的根节点为根的树中找到最大深度,并输出对应的根节点编号。注意,对于第二次 DFS,应该将根节点的深度视为 1,而不是 0。
时间复杂度为 O(n),可以通过本题。
阅读全文