携程8.30笔试第三题【DFS】

题目:树的每个节点被染为rgb三色,求删掉一条边,满足分成两个连通块都恰好包含三种颜色的边的数量。
思路:统计子树中含有的rgb的数量,判断是否包含三种颜色,然后再用总的rgb数减去子树中的rgb数量,判断是否包含三种颜色。
public class Xiecheng830Q3 {
        static int n, r, g, b;
        static char[] colors;
        static List<List<Integer>> nxs = new ArrayList<>();
        static int res = 0;

        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            n = sc.nextInt();
            sc.nextLine();
            colors = sc.nextLine().toCharArray();
            // 统计rgb的数量
            for(char c : colors) {
                if(c == 'r') r++;
                else if(c == 'g') g++;
                else b++;
            }
            // 初始化并构造无向图
            for(int i = 0; i < n; i++) nxs.add(new LinkedList<>());
            for(int i = 0; i < n - 1; i++) {
                int a = sc.nextInt() - 1;   //题目中给的下标是1开始
                int b = sc.nextInt() - 1;
                nxs.get(a).add(b);
                nxs.get(b).add(a);
            }
            // 起点随便选,-1表示不存在的节点
            dfs(1, -1);
            System.out.println(res);
        }

        static int[] dfs(int node, int pre) {
            int[] color = new int[3];
            if(colors[node] == 'r') color[0]++;
            else if(colors[node] == 'g') color[1]++;
            else color[2]++;

            //如果是叶子节点,就直接返回
            if(nxs.get(node).size() == 1 && nxs.get(node).get(0) == pre) return color;

            // 遍历相邻节点,把子树返回来的数量加到color里
            for(int nx : nxs.get(node)) {
                // nx != pre的条件是防止无向图往回走
                if(nx != pre) add(color, dfs(nx, node));
            }

            // 判断是否符合题目条件
            if(color[0] > 0 && color[1] > 0 && color[2] > 0 && r - color[0] > 0 && g - color[1] > 0 && b - color[2] > 0)  res++;
            return color;
        }

        // 数组相加
        static void add(int[] a, int[] b) {
            for(int i = 0; i < 3; i++) a[i] += b[i];
        }
}
样例:
7
rgbrgbg
1 2
2 3
3 4
4 5
5 6
6 7

1


#携程笔试#
全部评论
问一个很低级的问题,dfs里面删除一个边的操作怎么体现?
点赞 回复 分享
发布于 2022-08-31 23:36 上海
太秀了,怎么想到的
点赞 回复 分享
发布于 2022-08-31 18:45 湖北
这个更像bfs
点赞 回复 分享
发布于 2022-09-02 21:03 浙江
请问有没有可能,断了以后,成为3段子树而不是2段?
点赞 回复 分享
发布于 2022-08-31 22:06 江苏
请问又python代码吗
点赞 回复 分享
发布于 2022-08-31 12:02 四川

相关推荐

04-02 10:09
门头沟学院 Java
用微笑面对困难:这里面问题还是很多的,我也不清楚为啥大家会感觉没啥问题。首先就是全栈开发实习9个月的内容都没有java实习生的内容多,1整个技术栈没看出太核心和难点的内容,感觉好像被拉过去打杂了,而且全栈基本上很容易被毙。里面能问的bug是在太多了比如L:继承 BaseMapper 可直接使用内置方法’。请问你的 BaseMapper 是如何扫描实体类注解如果瞬时产生 100 个上传任务,MySQL 的索引设计是否会有瓶颈?你做过分库分表或者索引优化吗?全栈的内容可以针对动态难点去搞,技能特长写在下面吧,你写了这么多技能,项目和实习体现了多少?你可以在项目里多做文章然后把这个放下去,从大致来看实习不算太水,有含金量你也要写上内容针对哨兵里面的节点变化能问出一万个问题,这个很容易就爆了。
提前批简历挂麻了怎么办
点赞 评论 收藏
分享
评论
4
9
分享

创作者周榜

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