题解 | 牛牛的糖果树

牛牛的糖果树

https://www.nowcoder.com/practice/2bd533b4fd094ae6a0e46ff3db8415af

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static class Node {
        public int id = 0;
        public int color = 0;
        public ArrayList<Node> children = new ArrayList<>();

        public Node(int id) {
            this.id = id;
        }

        public Node() {

        }

        public String toString() {
            return String.valueOf(id);
        }
    }

    public static int gMax = -1;

    public static Map<Integer, Integer> DFS( Node head,
            Set<Integer> visited) {

        Map<Integer, Integer> colorTimes = new HashMap<>();
        int ret = 0;
        int old =  0;
        colorTimes.put(head.color, old + 1);

        visited.add(head.id);

        for (Node item : head.children) {
            if (visited.contains(item.id)) continue;

            Map<Integer, Integer> childColors = DFS(item, visited);
            for (Integer key : childColors.keySet()) {
                Integer times = childColors.get(key);

                int oldValue = colorTimes.getOrDefault(key, 0);
                colorTimes.put(key, oldValue + times);
            }
        }

        int maxTimes = 0;

        maxTimes = colorTimes.values().stream().max(Integer::compareTo).get();
        //System.out.println(colorTimes);

        final int temp = maxTimes;
        final Map<Integer, Integer> backupMap = new HashMap<>(colorTimes);

        colorTimes.entrySet().forEach((entry) -> {
            if (entry.getValue() == temp) {
                backupMap.remove(entry.getKey());
            }
        });

       // System.out.println(backupMap);

        for (Integer key : backupMap.keySet()) {
            Integer times = backupMap.get(key);



            for (int i = 0; i < times; i++) {
                if (ret == 0) {
                    ret = key;
                } else {
                    ret ^= key;
                }
            }
        }

        gMax = Math.max(gMax, ret);
        return colorTimes;
    }

    public static void getTreeNodeColors( Node head) {
        int ret = 0;
        Map<Integer, Integer> colorTimes = new HashMap<>();
        Set<Integer> visited = new HashSet<>();

        DFS(head, visited);
        System.out.println(gMax);
        
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        Node[] tree = new Node[n];
        int i = 0;

        //System.out.println(tree[0]);
        while (i < n) {
            tree[i] = new Node(i);
            tree[i].color = in.nextInt();
            i++;
        }

        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int indexNode1 = in.nextInt() - 1;
            int indexNode2 = in.nextInt() - 1;
            tree[indexNode1].children.add(tree[indexNode2]);
            tree[indexNode2].children.add(tree[indexNode1]);

        }

        getTreeNodeColors(tree[0]);

    }
}

不能用广度优先遍历,不好保存每个子树的已遍历节点的状态。

全部评论

相关推荐

爱睡觉的冰箱哥:你是我今晚见过的最美的牛客女孩
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务