题解 | #红和蓝#

红和蓝

https://www.nowcoder.com/practice/34bf2aaeb61f47be980b9ec0ab238c36

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    static int f[];
    static int[] color;
    static List<List<Integer>> Graph;
    //以上三个数组或集合第一个值,均为空,因为根节点是从1开始而不是0开始

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        f = new int[n+1];
        color = new int[n+1];
        Graph = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            Graph.add(new ArrayList<>());
        }
        for (int i = 0; i < n-1; i++) {
            int a = in.nextInt();
            int b = in.nextInt();
            // 双向边,防止死循环
            Graph.get(a).add(b);
            Graph.get(b).add(a);
        }
        //System.out.println(Graph);
        dfs1(1, 0);
        // 如果有节点未被配对,说明无答案
        for (int i = 1; i < n + 1; i++) {
            if (f[i] == 0){
                System.out.println(-1);
                return;
            }
        }
        color[1] = 1;
        dfs2(1, 0);
        for (int i = 1; i < n + 1; i++) {
            if (color[i] == 1){
                System.out.print("R");
            }else {
                System.out.print("B");
            }
        }
    }

    public static void dfs1(int u, int father){
        for (int i = 0; i < Graph.get(u).size(); i++) {
            int v = Graph.get(u).get(i);
            // father是u的父节点,也就是v的爷爷节点
            // 因为Graph保存的是双向边,uv已经考虑过了,vu就需要过滤掉,防止死循环
            if (v == father) continue;
            dfs1(v, u); // dfs自底向上递归
            // 如果uv还未配对,则将它们配对
            if (f[u] == 0 && f[v] == 0){
                f[u] = v;
                f[v] = u;
            }
        }
    }

    public static void dfs2(int u, int father){
        for (int i = 0; i < Graph.get(u).size(); i++) {
            int v = Graph.get(u).get(i);
            if (v == father) continue;
            if (f[u] == v){ // 配对成功的设置为相同颜色
                color[v] = color[u];
            }else { // 没有配对,需要更换另一种颜色
                color[v] = color[u] ^ 1; // 异或即可切换数字代表不同颜色
            }
            dfs2(v, u); //dfs 自顶向下递归遍历
        }
    }
}

全部评论

相关推荐

10-16 19:39
已编辑
门头沟学院 Java
小马云表哥:03男巨蟹座,喜欢家暴,爱好出轨,吃喝嫖赌样样精通,收入不固定,主要看女方给我多少钱,不会做家务,不会做饭,身高155体重190,爱玩马超,喜欢玩火影,喜欢陪岳父岳母爬山 爱玩原神😋
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务