LeetCode每日一题 判断二分图 染色法(golang)

题目
在这里插入图片描述
在这里插入图片描述

分析过程
这里用到的染色法
根据题意,二分图是指顶点由两个集合组成,且所有边的两个顶点正好分别处于两个集合里。我们可以用两种颜色代表这两个集合,相邻的顶点不能是同一种颜色,比如我们把一个节点染成红色,那么它相邻的节点就染成蓝色,当所有节点都能染上色,就是一个二分图。于是我们遍历每个顶点,再遍历当前顶点的所有相邻顶点,保证不漏掉顶点,使用深度搜索法

代码

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
}

猜你喜欢

转载自blog.csdn.net/qq_46595591/article/details/107382065