现在有一棵树,每条边的长度为 ,定义 为结点 之间的距离,定义结点 的权值为 ,现在求 到 所有点的权值。
返回 个整数,分别为
5,[(2,5),(5,3),(5,4),(5,1)]
[7,7,7,7,4]
第一个参数为整数 。
第二个参数为大小为 n-1n−1 的点对 (u_i, v_i)(ui,vi) 的集合 EdgeEdge ,其中 (u_i, v_i)(ui,vi) 表示结点 u_iui 与结点 v_ivi 之间有一条边,1leq u_i, v_i leq n1≤ui,vi≤n
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 点的数量 * @param edge Point类一维数组 Point.x , Point.y 边所连接的两个点 * @return long长整型一维数组 */ long count; // 记录某个点到其他点的距离 // bfs 做法 public long[] solve (int n, Point[] edge) { // write code here int[][] path = new int[n][n]; for (Point e : edge) { path[e.x - 1][e.y - 1] = 1; path[e.y - 1][e.x - 1] = 1; } long[] result = new long[n]; for (int i = 0; i < n; i++) { boolean[] visited = new boolean[n]; visited[i] = true; count = 0; bfs(i, visited, path, 1); result[i] = count; } return result; } private void bfs(int node, boolean[] visited, int[][] path, int step) { ArrayList<Integer> nextNodes = new ArrayList<>(); for (int i = 0; i < path[node].length; i++) { if (path[node][i] == 1 && !visited[i]) { nextNodes.add(i); visited[i] = true; count += step; } } for (int nextNode : nextNodes) { bfs(nextNode, visited, path, step + 1); // 随着递归的推进,距离越来越远,每次加一 } } }