利用邻接表进行图的深度搜索

小美的美丽树

https://www.nowcoder.com/questionTerminal/f4161b1bac304f5b803fed3e3758d4bb?f=discussion

图片说明
图片说明

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.ArrayList;

public class Main {
    static boolean[] visited;   // 标记节点是否已经被访问
    static int[] weight;        // 节点权值
    static int[] childNum;      // 存储以节点i为根的树有多少个节点
    static int[] max, min;      // 存储以节点i为根的子树下的最大值和最小值
    // 节点间的最大差值
    static int maxDiff = -1;
    // 待求节点
    static int node = -1;
    // 邻接表
    static HashMap<Integer, ArrayList<Integer>> tree;

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] temp = br.readLine().trim().split(" ");
        int n = Integer.parseInt(temp[0]);
        int k = Integer.parseInt(temp[1]);
        temp = br.readLine().trim().split(" ");
        weight = new int[n + 1];
        for(int i = 1; i <= n; i++) weight[i] = Integer.parseInt(temp[i - 1]);
        int x, y;
        // 构建树图的邻接表
        tree = new HashMap<>();
        ArrayList<Integer> list;
        for(int i = 1; i <= n - 1; i++){
            temp = br.readLine().trim().split(" ");
            x = Integer.parseInt(temp[0]);
            y = Integer.parseInt(temp[1]);
            if(tree.containsKey(x)){
                list = tree.get(x);
                list.add(y);
                tree.put(x, list);
            }else{
                list = new ArrayList<>();
                list.add(y);
                tree.put(x, list);
            }
            if(tree.containsKey(y)){
                list = tree.get(y);
                list.add(x);
                tree.put(y, list);
            }else{
                list = new ArrayList<>();
                list.add(x);
                tree.put(y, list);
            }
        }
        int root = Integer.parseInt(br.readLine().trim());
        visited = new boolean[n + 1];
        max = new int[n + 1];
        min = new int[n + 1];
        childNum = new int[n + 1];
        dfs(root, k);
        System.out.println(node);
    }
    //求取parent下面的最值
    public static void dfs(int parent, int k){
         visited[parent] = true;
        // 初始化parent下的最值为parent的节点权重
        max[parent] = weight[parent];
        min[parent] = weight[parent];
        // 初始情况下,该子树只有一个节点
        childNum[parent] = 1;
        for(int i = 0; i < tree.get(parent).size(); i++){
            int child = tree.get(parent).get(i);
            if(!visited[child]){
                // 没访问过这个孩子节点就进行深搜
                dfs(child, k);
                max[parent] = Math.max(max[parent], max[child]);
                min[parent] = Math.min(min[parent], min[child]);
                childNum[parent] += childNum[child];
            }
        }
        if(childNum[parent] <= k && max[parent] - min[parent] >= maxDiff){
            // 以parent为根节点的子树满足节点数小于等于k,且最大差值大于等于目前最大
            if(max[parent] - min[parent] > maxDiff){
                // 大于了直接更新,等于的话需要考虑哪个根节点的编号小
                node = parent;
                maxDiff = max[parent] - min[parent];
            }else{
                // 如果node还没有赋值,就直接赋值为当前节点,否则取满足要求的节点中编号最小的
                node = node == -1? parent: Math.min(node, parent);
            }
    }
}
}

总结

图的DFS:

  • 必须有个邻接表HashMap<Integer, ArrayList<Integer>>来记录相邻节点的关系,或者是矩阵。
  • 标记数组
  • 在限定条件下去进性深度优先搜索,再去更新一些我们要求的值
全部评论

相关推荐

NBA球星伦纳德:jd是这样的,工作连拧螺丝都算不上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11176次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
1976次浏览 42人参与
# MiniMax求职进展汇总 #
24135次浏览 309人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7665次浏览 43人参与
# 简历第一个项目做什么 #
31761次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433588次浏览 3926人参与
# 巨人网络春招 #
11381次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187236次浏览 1122人参与
# 牛客AI文生图 #
21453次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152481次浏览 888人参与
# 研究所笔面经互助 #
118979次浏览 577人参与
# 简历中的项目经历要怎么写? #
310399次浏览 4220人参与
# AI时代,哪些岗位最容易被淘汰 #
63905次浏览 828人参与
# 面试紧张时你会有什么表现? #
30521次浏览 188人参与
# 你今年的平均薪资是多少? #
213163次浏览 1039人参与
# 你怎么看待AI面试 #
180194次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64341次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76560次浏览 374人参与
# 我的求职精神状态 #
448160次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363555次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160688次浏览 1112人参与
# 校招笔试 #
471304次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务