红和蓝(java)

红和蓝

你拿到了一棵树,请你给每个顶点染成红色或蓝色。
要求:每个红点周围有且仅有一个红点,每个蓝点周围有且仅有一个蓝点。
“周围”的定义:某点周围的点指通过邻边直接连接的点。
所谓树,即没有自环、重边和回路的无向连通图。

输入描述:
第一行一个正整数 nnn,代表树的顶点个数.。(1≤n≤100000)(1 \leq n \leq 100000)(1≤n≤100000)
接下来的 n−1n-1n−1 行,每行两个正整数 uuu 和 vvv,代表点 uuu 和点 vvv 有一条边连接。 (1≤u,v≤n)(1 \leq u,v \leq n)(1≤u,v≤n)
保证输入的一定是一棵合法的树。

输出描述:
如果可以达成染色的要求,请输出一个长度为 nnn 的字符串,第 iii 个字符代表第 iii 个顶点的染色情况,‘B’ 代表蓝色,‘R’ 代表红色。(若有多种合法染色的方法,输出任意一种即可)
否则直接输出-1。

示例1
输入

4
1 2
2 3
3 4

输出

RRBB

说明

1为红点,它连接的边有只有一个红点:2
2为红点,它连接的边有只有一个红点:1
3为蓝点,它连接的边有只有一个蓝点:4
4为蓝点,它连接的边有只有一个蓝点:3

示例2
输入

4
1 2
1 3
1 4

输出

-1

import java.util.*;
import java.lang.*;
public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        HashMap<Integer,ArrayList<Integer>> map = new HashMap();
        HashSet<Integer> set  = new HashSet();
        for(int i = 0;i<n-1;i++){
            int a = sc.nextInt();
            int b = sc.nextInt();
            set.add(a);
            set.add(b);
            if(map.containsKey(a)){
                map.get(a).add(b);
            }else{
                ArrayList<Integer> arr = new ArrayList();
                arr.add(b);
                map.put(a,arr);
            }
        }


        int ans = 1;
        for(int i : set){
            if(map.containsKey(i)){
                if(map.get(i).size()>2){
                    ans = -1;
                }
            }
        }
        System.out.println(map.toString());
        if(ans==1){
            HashMap<Integer,Character> map1 = new HashMap();
            HashSet<Integer> set1  = new HashSet();
            map1.put(1,'R');
            Solution.dfs(map,map1,1,set1);
            for(int i =0;i<n;i++){
                System.out.print(map1.get(i+1));
            }
        }else{
            System.out.print(-1);
        }

    }

    public static void dfs( HashMap<Integer,ArrayList<Integer>> map, HashMap<Integer,Character> map1,int s, HashSet set){
        if(!map.containsKey(s)){
            return;
        }
        for(int next: map.get(s)){
            if(set.contains(next)){
                continue;
            }
            set.add(next);
            if(map1.get(s)=='R'){
                map1.put(next,'B');
            }else{
                map1.put(next,'R');
            }
            dfs(map,map1,next,set);
        }

    }
}
···
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值