题解 | #红和蓝#
红和蓝
https://www.nowcoder.com/practice/34bf2aaeb61f47be980b9ec0ab238c36
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]))
}
}
MDPI公司福利 431人发布