概述
给出一个无定向图。如果一个图的节点可以被划分为两个子集,使得每条边都连接着第一个子集的一个节点和第二个子集的另一个节点,那么这个图就被称为是二方的。
该图包含n个节点,编号从0到n-1。输入一个名为graph 的矩阵,这是一个二维矩阵,graph[i]包含与第i个节点连接的节点。例如,如果
graph[0] = [1,3] 。
这意味着节点0与节点1和节点3相连。
例子1

Input: [[1,3],[0,2],[1,3],[0,2]]
Output: true
例二

Input: [[1,4],[0,2],[1,3],[2,4],[0,3]
Output: false
我们的想法是在这里使用DFS。我们将尝试给每个节点分配红色或黑色的颜色。如果一个节点是红色的,那么它的邻居必须是黑色的。
-
我们能够以这种方式着色,那么该图就是二方的。
-
如果在着色时,我们发现由一条边连接的两个节点具有相同的颜色,那么该图就不是二方的。
让我们来看看这个程序
程序
以下是相同的程序
package main
import "fmt"
func isBipartite(graph [][]int) bool {
nodeMap := make(map[int][]int)
numNodes := len(graph)
if numNodes == 1 {
return true
}
for i := 0; i < numNodes; i++ {
nodes := graph[i]
for j := 0; j < len(nodes); j++ {
nodeMap[i] = append(nodeMap[i], nodes[j])
}
}
color := make(map[int]int)
for i := 0; i < numNodes; i++ {
if color[i] == 0 {
color[i] = 1
isBiPartite := visit(i, nodeMap, &color)
if !isBiPartite {
return false
}
}
}
return true
}
func visit(source int, nodeMap map[int][]int, color *map[int]int) bool {
for _, neighbour := range nodeMap[source] {
if (*color)[neighbour] == 0 {
if (*color)[source] == 1 {
(*color)[neighbour] = 2
} else {
(*color)[neighbour] = 1
}
isBipartite := visit(neighbour, nodeMap, color)
if !isBipartite {
return false
}
} else {
if (*color)[source] == (*color)[neighbour] {
return false
}
}
}
return true
}
func main() {
output := isBipartite([][]int{{1, 3}, {0, 2}, {1, 3}, {0, 2}})
fmt.Println(output)
output = isBipartite([][]int{{1, 4}, {0, 2}, {1, 3}, {2, 4}, {0, 3}})
fmt.Println(output)
}
true
false