描述
题意
n个节点n-1条边的无向连通图,两个点a,b,a位于1,b位于x,两点移动速度相同,求a和b移动到同一节点所需的最多节点数。
输入
第一个参数为 n ,(1≤n≤100,000)
第二个参数为 x ,(1≤x≤n)
第三个参数为大小为 n−1 的点对 (ui,vi) 的集合,其中(ui,vi) 表示结点ui 与结点 vi 之间有一条边,1≤ui,vi≤n
返回
最多需要经过的节点数(包括 1 号节点在内)
示例1
输入:
5,2,[(1,2),(2,3),(3,4),(2,5)]
返回值:
4
这个问题可以使用广度优先搜索(BFS)来解决。首先,我们需要将边的信息存储在一个邻接矩阵中。然后,我们从节点1开始,使用BFS遍历所有可能的路径,直到到达节点x。在遍历过程中,我们需要记录每个节点的最短距离。最后,我们返回经过的最多节点数。
以下是使用Java编写的解决方案:
import java.util.*;
public class Solution {
public int solve(int n, int x, Point[] edges) {
// 创建邻接矩阵
int[][] adjMatrix = new int[n + 1][n + 1];
for (Point edge : edges) {
adjMatrix[edge.x][edge.y] = 1;
adjMatrix[edge.y][edge.x] = 1;
}
// 使用BFS遍历所有可能的路径
Queue<Integer> queue = new LinkedList<>();
boolean[] visited = new boolean[n + 1];
int[] distance = new int[n + 1];
Arrays.fill(distance, -1);
queue.add(1);
visited[1] = true;
distance[1] = 0;
while (!queue.isEmpty()) {
int currNode = queue.poll();
if (currNode == x) {
break;
}
for (int i = 1; i <= n; i++) {
if (adjMatrix[currNode][i] == 1 && !visited[i]) {
queue.add(i);
visited[i] = true;
distance[i] = distance[currNode] + 1;
}
}
}
// 返回经过的最多节点数
return distance[x];
}
}
这个解决方案的时间复杂度为O(n^2),因为我们需要遍历邻接矩阵。在实际应用中,可以使用更高效的数据结构(如邻接表)来优化时间复杂度。