题目地址:
https://www.acwing.com/problem/content/3702/
树是一种特殊的图结构,有根树是一个有固定根的树。现在给定一棵有根树,编程求出树中所有节点到指定的根节点最远距离。
输入格式:
第一行是两个整数
N
,
M
N,M
N,M,表示数的顶点数和根节点的编号。
接下来
N
−
1
N−1
N−1行,每行两个整数
u
,
v
u,v
u,v,表示编号为
u
u
u的节点和编号为
v
v
v的节点间有一无向条边。
输出格式:
输出距离根节点最远的点到根的距离。
数据范围:
1
≤
N
≤
10000
1≤N≤10000
1≤N≤10000
1
≤
M
≤
N
1≤M≤N
1≤M≤N
1
≤
u
,
v
≤
N
1≤u,v≤N
1≤u,v≤N
BFS记录一下层数,答案就是层数减 1 1 1。代码如下:
#include <cstring>
#include <iostream>
using namespace std;
const int N = 10010, M = N << 1;
int n;
int root;
int h[N], e[M], ne[M], idx;
int q[N];
bool vis[N];
#define add(a, b) e[idx] = b, ne[idx] = h[a], h[a] = idx++
int bfs() {
int res = 0;
int hh = 0, tt = 1;
q[hh] = root;
vis[root] = true;
while (hh < tt) {
for (int i = tt - hh; i; i--) {
int t = q[hh++];
for (int j = h[t]; ~j; j = ne[j]) {
int v = e[j];
if (!vis[v]) {
q[tt++] = v;
vis[v] = true;
}
}
}
if (hh < tt) res++;
}
return res - 1;
}
int main() {
scanf("%d%d", &n, &root);
memset(h, -1, sizeof h);
for (int i = 1; i <= n - 1; i++) {
int a, b;
scanf("%d%d", &a, &b);
add(a, b), add(b, a);
}
printf("%d\n", bfs());
}
时空复杂度 O ( n ) O(n) O(n)。