package main import ( "fmt" ) func main() { var n int var edge = make(map[int][]int, 0) mask := make(map[int]struct{}) fmt.Scan(&n) for i := 1; i < n; i++ { var a, b int fmt.Scan(&a, &b) edge[a] = append(edge[a], b) edge[b] = append(edge[b], a) } dp := make([][]int, 400040) // 0 第一个红 // 1 第二个红 // 2 第一个蓝 // 3 第二个蓝 // dp[1<<2+0] = -1 // dp[1<<2+2] = -1 var dfs func(root int) dfs = func(root int) { mask[root] = struct{}{} if (root == 1 && len(edge[root]) > 0) || (root != 1 && len(edge[root]) > 1) { for _, item := range edge[root] { if _, ok := mask[item]; ok { continue } dfs(item) } mark1, mark2, mark3, mark4 := true, true, true, true list := make([]int, 0, len(edge[root])) // 假定当前为第一个红 for _, item := range edge[root] { if _, ok := mask[item]; ok { continue } if len(dp[item<<2+3]) == 0 { mark1 = false break } list = append(list, item<<2+3) } if mark1 { dp[root<<2] = list } list = make([]int, 0, len(edge[root])) // 假定当前为第二个红 TODO // 查找第一个红 red := 0 for _, item := range edge[root] { if _, ok := mask[item]; ok { continue } if len(dp[item<<2+3]) == 0 { if red == 0 && len(dp[item<<2]) != 0 { red = item << 2 list = append(list, item<<2) continue } mark2 = false break } list = append(list, item<<2+3) } if mark2 { if red == 0 { for _, item := range edge[root] { if _, ok := mask[item]; ok { continue } if len(dp[item<<2]) != 0 { list[len(list)-1] = item << 2 dp[root<<2+1] = list break } } } else { dp[root<<2+1] = list } } list = make([]int, 0, len(edge[root])) // 假定当前为第1个蓝 for _, item := range edge[root] { if _, ok := mask[item]; ok { continue } if len(dp[item<<2+1]) == 0 { mark3 = false break } list = append(list, item<<2+1) } if mark3 { dp[root<<2+2] = list } list = list[:0] // 假定当前为第二个蓝 // 查找第一个蓝 blue := 0 for _, item := range edge[root] { if _, ok := mask[item]; ok { continue } if len(dp[item<<2+1]) == 0 { if blue == 0 && len(dp[item<<2+2]) != 0 { blue = item<<2 + 2 list = append(list, item<<2+2) continue } mark4 = false break } list = append(list, item<<2+1) } if mark4 { if blue == 0 { for _, item := range edge[root] { if _, ok := mask[item]; ok { continue } if len(dp[item<<2+2]) != 0 { list[len(list)-1] = item<<2 + 2 dp[root<<2+3] = list break } } } else { dp[root<<2+3] = list } } } else { dp[root<<2+0] = []int{-1} dp[root<<2+2] = []int{-1} } delete(mask, root) } dfs(1) var runes [100020]rune ans := false if !ans && len(dp[1<<2+1]) != 0 { ans = true runes[1] = 'R' queue := append([]int{}, 1<<2+1) for len(queue) != 0 { root := queue[0] queue = queue[1:] for _, item := range dp[root] { if item == -1 { continue } if item%4 < 2 { runes[item>>2] = 'R' } else { runes[item>>2] = 'B' } queue = append(queue, item) } } } if !ans && len(dp[1<<2+3]) != 0 { runes[1] = 'B' queue := append([]int{}, 1<<2+3) for len(queue) != 0 { root := queue[0] queue = queue[1:] for _, item := range dp[root] { if item == -1 { continue } if item%4 < 2 { runes[item>>2] = 'R' } else { runes[item>>2] = 'B' } queue = append(queue, item) } } } if !ans { fmt.Println(-1) } else { fmt.Println(string(runes[1:n+1])) } }