Skip to content

Commit 227b9e0

Browse files
author
xiaolingtong@bilibili.com
committed
bfs + setcolor
1 parent 4df2060 commit 227b9e0

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.blankj.medium._1462
2+
3+
import com.blankj.ext.print
4+
import com.blankj.structure.MultiDimensionArray
5+
6+
class Solution {
7+
fun checkIfPrerequisite(numCourses: Int, prerequisites: Array<IntArray>, queries: Array<IntArray>): List<Boolean> {
8+
val graph = mutableMapOf<Int, MutableList<Int>>()
9+
repeat(numCourses) { graph[it] = mutableListOf() }
10+
val inDegree = IntArray(numCourses)
11+
// isPre[i][j] 记录了 i 是否是 j 的先修课
12+
val isPre = Array(numCourses) { BooleanArray(numCourses) }
13+
for (prerequisite in prerequisites) {
14+
++inDegree[prerequisite[1]]
15+
graph[prerequisite[0]]!!.add(prerequisite[1])
16+
}
17+
val queue = ArrayDeque<Int>()
18+
queue.addAll(inDegree.indices.filter { inDegree[it] == 0 })
19+
while (queue.isNotEmpty()) {
20+
val cur = queue.removeFirst()
21+
for (next in graph[cur]!!) {
22+
isPre[cur][next] = true
23+
// 遍历更新先修课的先修课到当前课程的状态
24+
for (i in 0 until numCourses) {
25+
isPre[i][next] = isPre[i][next] or isPre[i][cur]
26+
}
27+
--inDegree[next]
28+
if (inDegree[next] == 0) {
29+
queue.add(next)
30+
}
31+
}
32+
}
33+
val res = mutableListOf<Boolean>()
34+
for (query in queries) {
35+
res.add(isPre[query[0]][query[1]])
36+
}
37+
return res
38+
}
39+
}
40+
41+
fun main() {
42+
Solution().checkIfPrerequisite(
43+
2,
44+
MultiDimensionArray.createTestData("[[1,0]]"),
45+
MultiDimensionArray.createTestData("[[0,1],[1,0]]"),
46+
).print()
47+
48+
Solution().checkIfPrerequisite(
49+
2,
50+
emptyArray(),
51+
MultiDimensionArray.createTestData("[[1,0],[0,1]]"),
52+
).print()
53+
54+
Solution().checkIfPrerequisite(
55+
3,
56+
MultiDimensionArray.createTestData("[[1,2],[1,0],[2,0]]"),
57+
MultiDimensionArray.createTestData("[[1,0],[1,2]]"),
58+
).print()
59+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.blankj.medium._886
2+
3+
import com.blankj.ext.print
4+
import com.blankj.structure.MultiDimensionArray
5+
6+
class Solution {
7+
private fun setColor(
8+
graph: MutableMap<Int, MutableList<Int>>,
9+
colors: IntArray,
10+
i: Int,
11+
color: Int
12+
): Boolean {
13+
val queue = ArrayDeque<Int>()
14+
colors[i] = color
15+
queue.add(i)
16+
while (queue.isNotEmpty()) {
17+
val cur = queue.removeFirst()
18+
for (next in graph[cur]!!) {
19+
if (colors[next] >= 0) {
20+
if (colors[next] == colors[cur]) {
21+
return false
22+
}
23+
} else {
24+
queue.add(next)
25+
colors[next] = 1 - colors[cur]
26+
}
27+
}
28+
}
29+
return true
30+
}
31+
32+
fun possibleBipartition(n: Int, dislikes: Array<IntArray>): Boolean {
33+
val colors = IntArray(n + 1) { -1 }
34+
val graph = mutableMapOf<Int, MutableList<Int>>()
35+
repeat(n + 1) { graph[it] = mutableListOf() }
36+
for (edge in dislikes) {
37+
graph[edge[0]]?.add(edge[1])
38+
graph[edge[1]]?.add(edge[0])
39+
}
40+
for (i in 1..n) {
41+
if (colors[i] == -1 && !setColor(graph, colors, i, 0)) {
42+
return false
43+
}
44+
}
45+
return true
46+
}
47+
}
48+
49+
fun main() {
50+
Solution().possibleBipartition(
51+
4,
52+
MultiDimensionArray.createTestData("[[1,2],[1,3],[2,4]]")
53+
).print()
54+
Solution().possibleBipartition(
55+
3,
56+
MultiDimensionArray.createTestData("[[1,2],[1,3],[2,3]]")
57+
).print()
58+
Solution().possibleBipartition(
59+
5,
60+
MultiDimensionArray.createTestData("[[1,2],[2,3],[3,4],[4,5],[1,5]]")
61+
).print()
62+
}

0 commit comments

Comments
 (0)