题目
分析过程
这里用到的染色法
根据题意,二分图是指顶点由两个集合组成,且所有边的两个顶点正好分别处于两个集合里。我们可以用两种颜色代表这两个集合,相邻的顶点不能是同一种颜色,比如我们把一个节点染成红色,那么它相邻的节点就染成蓝色,当所有节点都能染上色,就是一个二分图。于是我们遍历每个顶点,再遍历当前顶点的所有相邻顶点,保证不漏掉顶点,使用深度搜索法
代码
func isBipartite(graph [][]int) bool {
type color int
const (
blue = 1
red = 2
) //设置染色的颜色
getColor := func(c color) color {
if c == blue {
return red
}
return blue
} //设置染色规则
m := map[int]color{}
res := true
var dfs func(v int, c color)
dfs = func(v int, c color) {
if !res {
return
} // 保存已访问过的顶点,以及它们的颜色
if m[v] != 0 {
if m[v] != c {
res = false
}
return
} // 如果一个顶点已经被访问过,则需要跳过,而跳过前需要判断它的颜色有没有冲突,若有则返回false
m[v] = c
for _, w := range graph[v] {
dfs(w, getColor(c))
}
}
for v := range graph {
if m[v] == 0 {
dfs(v, blue)
}
if !res {
break
}
}
// 用例中的图不一定是连通的,因此需要对每个子图进行判断;直接循环所有顶点
// 如果某个顶点所在子图已经执行过,则跳过
return res
}