diff --git a/leetcode/0785.Is-Graph-Bipartite/785. Is Graph Bipartite.go b/leetcode/0785.Is-Graph-Bipartite/785. Is Graph Bipartite.go new file mode 100644 index 00000000..e0b6089a --- /dev/null +++ b/leetcode/0785.Is-Graph-Bipartite/785. Is Graph Bipartite.go @@ -0,0 +1,35 @@ +package leetcode + +// DFS 染色,1 是红色,0 是绿色,-1 是未染色 +func isBipartite(graph [][]int) bool { + colors := make([]int, len(graph)) + for i := range colors { + colors[i] = -1 + } + for i := range graph { + if !dfs(i, graph, colors, -1) { + return false + } + } + return true +} + +func dfs(n int, graph [][]int, colors []int, parentCol int) bool { + if colors[n] == -1 { + if parentCol == 1 { + colors[n] = 0 + } else { + colors[n] = 1 + } + } else if colors[n] == parentCol { + return false + } else if colors[n] != parentCol { + return true + } + for _, c := range graph[n] { + if !dfs(c, graph, colors, colors[n]) { + return false + } + } + return true +} diff --git a/leetcode/0785.Is-Graph-Bipartite/785. Is Graph Bipartite_test.go b/leetcode/0785.Is-Graph-Bipartite/785. Is Graph Bipartite_test.go new file mode 100644 index 00000000..862eaf59 --- /dev/null +++ b/leetcode/0785.Is-Graph-Bipartite/785. Is Graph Bipartite_test.go @@ -0,0 +1,52 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question785 struct { + para785 + ans785 +} + +// para 是参数 +// one 代表第一个参数 +type para785 struct { + graph [][]int +} + +// ans 是答案 +// one 代表第一个答案 +type ans785 struct { + one bool +} + +func Test_Problem785(t *testing.T) { + + qs := []question785{ + + { + para785{[][]int{{1, 3}, {0, 2}, {1, 3}, {0, 2}}}, + ans785{true}, + }, + + { + para785{[][]int{{1, 2, 3}, {0, 2}, {0, 1, 3}, {0, 2}}}, + ans785{false}, + }, + + { + para785{[][]int{{1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2}}}, + ans785{false}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 785------------------------\n") + + for _, q := range qs { + _, p := q.ans785, q.para785 + fmt.Printf("【input】:%v 【output】:%v\n", p, isBipartite(p.graph)) + } + fmt.Printf("\n\n\n") +} diff --git a/leetcode/0785.Is-Graph-Bipartite/README.md b/leetcode/0785.Is-Graph-Bipartite/README.md new file mode 100644 index 00000000..a5eb6679 --- /dev/null +++ b/leetcode/0785.Is-Graph-Bipartite/README.md @@ -0,0 +1,98 @@ +# [785. Is Graph Bipartite?](https://leetcode.com/problems/is-graph-bipartite/) + + +## 题目 + +Given an undirected `graph`, return `true` if and only if it is bipartite. + +Recall that a graph is *bipartite* if we can split it's set of nodes into two independent subsets A and B such that every edge in the graph has one node in A and another node in B. + +The graph is given in the following form: `graph[i]` is a list of indexes `j` for which the edge between nodes `i` and `j` exists. Each node is an integer between `0` and `graph.length - 1`. There are no self edges or parallel edges: `graph[i]` does not contain `i`, and it doesn't contain any element twice. + + + Example 1:Input: [[1,3], [0,2], [1,3], [0,2]] + Output: true + Explanation: + The graph looks like this: + 0----1 + | | + | | + 3----2 + We can divide the vertices into two groups: {0, 2} and {1, 3}. + + + Example 2:Input: [[1,2,3], [0,2], [0,1,3], [0,2]] + Output: false + Explanation: + The graph looks like this: + 0----1 + | \ | + | \ | + 3----2 + We cannot find a way to divide the set of nodes into two independent subsets. + + +**Note:** + +- `graph` will have length in range `[1, 100]`. +- `graph[i]` will contain integers in range `[0, graph.length - 1]`. +- `graph[i]` will not contain `i` or duplicate values. +- The graph is undirected: if any element `j` is in `graph[i]`, then `i` will be in `graph[j]`. + +## 题目大意 + +给定一个无向图 graph,当这个图为二分图时返回 true。 + +graph 将会以邻接表方式给出,graph[i] 表示图中与节点i相连的所有节点。每个节点都是一个在 0 到 graph.length-1 之间的整数。这图中没有自环和平行边: graph[i] 中不存在 i,并且 graph[i] 中没有重复的值。 + +注意: + +- graph 的长度范围为 [1, 100]。 +- graph[i] 中的元素的范围为 [0, graph.length - 1]。 +- graph[i] 不会包含 i 或者有重复的值。 +- 图是无向的: 如果 j 在 graph[i] 里边, 那么 i 也会在 graph[j] 里边。 + +## 解题思路 + +- 判断一个无向图是否是二分图。二分图的定义:如果我们能将一个图的节点集合分割成两个独立的子集 A 和 B,并使图中的每一条边的两个节点一个来自 A 集合,一个来自 B 集合,我们就将这个图称为二分图。 +- 这一题可以用 BFS、DFS、并查集来解答。这里是 DFS 实现。任选一个节点开始,把它染成红色,然后对整个图 DFS 遍历,把与它相连的节点并且未被染色的,都染成绿色。颜色不同的节点代表不同的集合。这时候还可能遇到第 2 种情况,与它相连的节点已经有颜色了,并且这个颜色和前一个节点的颜色相同,这就说明了该无向图不是二分图。可以直接 return false。如此遍历到所有节点都染色了,如果能染色成功,说明该无向图是二分图,返回 true。 + +## 代码 + +```go +package leetcode + +// DFS 染色,1 是红色,0 是绿色,-1 是未染色 +func isBipartite(graph [][]int) bool { + colors := make([]int, len(graph)) + for i := range colors { + colors[i] = -1 + } + for i := range graph { + if !dfs(i, graph, colors, -1) { + return false + } + } + return true +} + +func dfs(n int, graph [][]int, colors []int, parentCol int) bool { + if colors[n] == -1 { + if parentCol == 1 { + colors[n] = 0 + } else { + colors[n] = 1 + } + } else if colors[n] == parentCol { + return false + } else if colors[n] != parentCol { + return true + } + for _, c := range graph[n] { + if !dfs(c, graph, colors, colors[n]) { + return false + } + } + return true +} +``` \ No newline at end of file diff --git a/leetcode/785.Is Graph Bipartite? b/leetcode/785.Is Graph Bipartite? deleted file mode 100644 index aadc2330..00000000 --- a/leetcode/785.Is Graph Bipartite? +++ /dev/null @@ -1,44 +0,0 @@ -func isBipartite(graph [][]int) bool { - colors := make([]int,len(graph)) - - - for i := range colors { - colors[i] = -1 - } - - - for i := range graph { - if !dfs(i, graph, colors, -1) { - fmt.Println(colors) - return false - } - } - - fmt.Println(colors) - return true - -} - -func dfs(n int, graph [][]int, colors []int, parentCol int) bool { - if colors[n] == -1 { - if parentCol == 1 { - colors[n] = 0 - } else { - colors[n] = 1 - } - } else if colors[n] == parentCol { - fmt.Println(n) - return false - } else if colors[n] != parentCol { - return true - } - - - for _, c := range graph[n] { - if !dfs(c, graph, colors, colors[n]) { - fmt.Println(c) - return false - } - } - return true -} diff --git a/website/content/ChapterFour/0785.Is-Graph-Bipartite.md b/website/content/ChapterFour/0785.Is-Graph-Bipartite.md new file mode 100644 index 00000000..a5eb6679 --- /dev/null +++ b/website/content/ChapterFour/0785.Is-Graph-Bipartite.md @@ -0,0 +1,98 @@ +# [785. Is Graph Bipartite?](https://leetcode.com/problems/is-graph-bipartite/) + + +## 题目 + +Given an undirected `graph`, return `true` if and only if it is bipartite. + +Recall that a graph is *bipartite* if we can split it's set of nodes into two independent subsets A and B such that every edge in the graph has one node in A and another node in B. + +The graph is given in the following form: `graph[i]` is a list of indexes `j` for which the edge between nodes `i` and `j` exists. Each node is an integer between `0` and `graph.length - 1`. There are no self edges or parallel edges: `graph[i]` does not contain `i`, and it doesn't contain any element twice. + + + Example 1:Input: [[1,3], [0,2], [1,3], [0,2]] + Output: true + Explanation: + The graph looks like this: + 0----1 + | | + | | + 3----2 + We can divide the vertices into two groups: {0, 2} and {1, 3}. + + + Example 2:Input: [[1,2,3], [0,2], [0,1,3], [0,2]] + Output: false + Explanation: + The graph looks like this: + 0----1 + | \ | + | \ | + 3----2 + We cannot find a way to divide the set of nodes into two independent subsets. + + +**Note:** + +- `graph` will have length in range `[1, 100]`. +- `graph[i]` will contain integers in range `[0, graph.length - 1]`. +- `graph[i]` will not contain `i` or duplicate values. +- The graph is undirected: if any element `j` is in `graph[i]`, then `i` will be in `graph[j]`. + +## 题目大意 + +给定一个无向图 graph,当这个图为二分图时返回 true。 + +graph 将会以邻接表方式给出,graph[i] 表示图中与节点i相连的所有节点。每个节点都是一个在 0 到 graph.length-1 之间的整数。这图中没有自环和平行边: graph[i] 中不存在 i,并且 graph[i] 中没有重复的值。 + +注意: + +- graph 的长度范围为 [1, 100]。 +- graph[i] 中的元素的范围为 [0, graph.length - 1]。 +- graph[i] 不会包含 i 或者有重复的值。 +- 图是无向的: 如果 j 在 graph[i] 里边, 那么 i 也会在 graph[j] 里边。 + +## 解题思路 + +- 判断一个无向图是否是二分图。二分图的定义:如果我们能将一个图的节点集合分割成两个独立的子集 A 和 B,并使图中的每一条边的两个节点一个来自 A 集合,一个来自 B 集合,我们就将这个图称为二分图。 +- 这一题可以用 BFS、DFS、并查集来解答。这里是 DFS 实现。任选一个节点开始,把它染成红色,然后对整个图 DFS 遍历,把与它相连的节点并且未被染色的,都染成绿色。颜色不同的节点代表不同的集合。这时候还可能遇到第 2 种情况,与它相连的节点已经有颜色了,并且这个颜色和前一个节点的颜色相同,这就说明了该无向图不是二分图。可以直接 return false。如此遍历到所有节点都染色了,如果能染色成功,说明该无向图是二分图,返回 true。 + +## 代码 + +```go +package leetcode + +// DFS 染色,1 是红色,0 是绿色,-1 是未染色 +func isBipartite(graph [][]int) bool { + colors := make([]int, len(graph)) + for i := range colors { + colors[i] = -1 + } + for i := range graph { + if !dfs(i, graph, colors, -1) { + return false + } + } + return true +} + +func dfs(n int, graph [][]int, colors []int, parentCol int) bool { + if colors[n] == -1 { + if parentCol == 1 { + colors[n] = 0 + } else { + colors[n] = 1 + } + } else if colors[n] == parentCol { + return false + } else if colors[n] != parentCol { + return true + } + for _, c := range graph[n] { + if !dfs(c, graph, colors, colors[n]) { + return false + } + } + return true +} +``` \ No newline at end of file diff --git a/website/content/menu/index.md b/website/content/menu/index.md index 43832d46..abd00fce 100644 --- a/website/content/menu/index.md +++ b/website/content/menu/index.md @@ -379,6 +379,7 @@ headless: true - [0778.Swim-in-Rising-Water]({{< relref "/ChapterFour/0778.Swim-in-Rising-Water.md" >}}) - [0781.Rabbits-in-Forest]({{< relref "/ChapterFour/0781.Rabbits-in-Forest.md" >}}) - [0784.Letter-Case-Permutation]({{< relref "/ChapterFour/0784.Letter-Case-Permutation.md" >}}) + - [0785.Is-Graph-Bipartite]({{< relref "/ChapterFour/0785.Is-Graph-Bipartite.md" >}}) - [0786.K-th-Smallest-Prime-Fraction]({{< relref "/ChapterFour/0786.K-th-Smallest-Prime-Fraction.md" >}}) - [0793.Preimage-Size-of-Factorial-Zeroes-Function]({{< relref "/ChapterFour/0793.Preimage-Size-of-Factorial-Zeroes-Function.md" >}}) - [0802.Find-Eventual-Safe-States]({{< relref "/ChapterFour/0802.Find-Eventual-Safe-States.md" >}})