红和蓝
你拿到了一棵树,请你给每个顶点染成红色或蓝色。
要求:每个红点周围有且仅有一个红点,每个蓝点周围有且仅有一个蓝点。
“周围”的定义:某点周围的点指通过邻边直接连接的点。
所谓树,即没有自环、重边和回路的无向连通图。
输入描述:
第一行一个正整数 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);
}
}
}
···