首页 > 试题广场 >

我们的距离

[编程题]我们的距离
  • 热度指数:238 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛妹给牛牛出了一道题,牛牛需要通过这道题才能见到牛妹。
现在有一棵树,每条边的长度为 ,定义 为结点 之间的距离,定义结点 的权值为 ,现在求  所有点的权值。
返回  个整数,分别为
示例1

输入

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); // 随着递归的推进,距离越来越远,每次加一
        }
    }
}

发表于 2021-05-10 23:24:34 回复(0)