思路:
题目的主要信息:
- n个节点n-1条边的无向连通图,即一棵无向树
- 两个节点a与b,其中a在节点1,b在节点x,两点移动速度相同,求a和b移动到同一节点所需的最多节点数,需要包括1号节点在内
方法一:dfs
具体做法:
我们可以使用两次dfs分别求得树中每个节点到节点1和节点x的距离,然后遍历找到包含节点1的最大距离即是所经过的最多节点数。
dfs时我们采用递归,子节点距离等于父节点距离加1,然后递归遍历该节点的所有子节点(不能是父节点)。
class Solution {
public:
void dfs(int cur, int pre, vector<int>& dis, vector<vector<int>>& G){
dis[cur] = dis[pre] + 1; //子节点距离等于父节点距离加1
for(int i = 0; i < G[cur].size(); i++){
if(G[cur][i] != pre)
dfs(G[cur][i], cur, dis, G);
}
}
int solve(int n, int x, vector<Point>& Edge) {
int res = 0;
vector<int> dis1(n + 1, 0);
vector<int> disx(n + 1, 0);
vector<vector<int> > G(n + 1);
for(int i = 0; i < Edge.size(); i++){ //构建图
G[Edge[i].x].push_back(Edge[i].y);
G[Edge[i].y].push_back(Edge[i].x);
}
dfs(1, 0, dis1, G); //记录其他节点到1的距离
dfs(x, 0, disx, G); //记录其他节点到x的距离
for(int i = 1; i <= n; i++)
if(dis1[i] > disx[i]) //找到最大的节点数,包括1在内
res = max(res, dis1[i]);
return res;
}
};复杂度分析:
- 时间复杂度:
,遍历每一个节点,后面找最大值也是
- 空间复杂度:
,辅助矩阵G最多有
个元素
方法二:bfs
具体做法:
我们也可以从节点1和节点x分别做bfs,记录每一层的距离,遍历每一个节点,即可得到方法一中的到所有节点到节点1和节点x的距离。然后像方法一一样遍历寻找最大值。
bfs的时候是从节点1或者节点x出发,因此需要初始化为这个点的距离为1,然后借助队列,将节点和距离作为pair入队,便可以在bfs的时候距离跟着走,同一层的距离相同,只要用到了子节点进入下一层,距离就会增加1.用距离为0表示还未访问过该节点。
class Solution {
public:
void bfs(int cur, vector<int>& dis, vector<vector<int>>& G){
queue<pair<int, int> > q;
q.push(make_pair(cur, dis[cur])); //节点和距离要求的节点数入队
while(!q.empty()){ //bfs
int node = q.front().first;
int dist = q.front().second;
q.pop();
for(int i = 0; i < G[node].size(); i++){
if(dis[G[node][i]] == 0){ //没有访问过
dis[G[node][i]] = dist + 1;
q.push(make_pair(G[node][i], dis[G[node][i]]));
}
}
}
}
int solve(int n, int x, vector<Point>& Edge) {
int res = 0;
vector<int> dis1(n + 1, 0);
vector<int> disx(n + 1, 0);
vector<vector<int> > G(n + 1);
for(int i = 0; i < Edge.size(); i++){ //构建图
G[Edge[i].x].push_back(Edge[i].y);
G[Edge[i].y].push_back(Edge[i].x);
}
dis1[1] = 1;
disx[x] = 1; //初始化1和x这两个点
bfs(1, dis1, G); //记录其他节点到1的距离
bfs(x, disx, G); //记录其他节点到x的距离
for(int i = 1; i <= n; i++)
if(dis1[i] > disx[i]) //找到最大的节点数,包括1在内
res = max(res, dis1[i]);
return res;
}
};复杂度分析:
- 时间复杂度:
,遍历每一个节点,后面找最大值也是
- 空间复杂度:
,辅助矩阵G最多有
个元素,辅助队列长度最大为

京公网安备 11010502036488号