题干
C++实现
- 看似考察树,实则考察图。因为父子关系不清晰
- 可以把树看成图的特例
- 邻接表法存储
- 从根出发,使用BFS
- visited[]数组,记录某个结点是否访问过
#include <stdio.h>
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n,m;
scanf("%d%d",&n,&m);
vector<vector<int>> tree(n+1);
for(int i = 0; i < n-1; ++i) {
int u,v;
scanf("%d%d",&u,&v);
tree[u].push_back(v);
tree[v].push_back(u);
}
queue<int> toVisit;
vector<int> distance(n+1);
int maxDist = 0;
for(int i = 1; i < n; ++i) {
distance[i] = -1;
}
distance[m] = 0;
toVisit.push(m);
while(toVisit.empty() == false) {
int cur = toVisit.front();
toVisit.pop();
for(int i = 0;i < tree[cur].size(); ++i){
int child = tree[cur][i];
if(distance[child] != -1){
continue;
}
toVisit.push(child);
distance[child] = distance[cur] + 1;
maxDist = distance[child];
}
}
printf("%d\n",maxDist);
system("pause");
return 0;
}