牛客题霸:TH30 最多节点数

描述

题意

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),因为我们需要遍历邻接矩阵。在实际应用中,可以使用更高效的数据结构(如邻接表)来优化时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清贫码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值