Skip to content

Commit 69f1bb3

Browse files
committed
add floydWarshallBitset
1 parent 79dd9e8 commit 69f1bb3

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

copypasta/graph.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,6 +1346,33 @@ func (*graph) shortestPathFloydWarshall(in io.Reader, n, m int) [][]int {
13461346
return dist
13471347
}
13481348

1349+
// 位压缩版 O(n^3/w)
1350+
// LC双周赛67C https://leetcode-cn.com/problems/detonate-the-maximum-bombs/
1351+
func (*graph) floydWarshallBitset(in io.Reader, n, m int) []int {
1352+
vs := make([]Bitset, n) // vs[i] 表示从 i 出发可以到达的节点
1353+
for i := range vs {
1354+
vs[i] = NewBitset(n)
1355+
vs[i].Set(i)
1356+
}
1357+
for i := 0; i < m; i++ {
1358+
var v, w int
1359+
Fscan(in, &v, &m)
1360+
vs[v].Set(w) // 有向边
1361+
}
1362+
for k := range vs { // 阶段
1363+
for i := range vs { // 状态
1364+
if vs[i].Has(k) {
1365+
vs[i].Merge(vs[k]) // 决策
1366+
}
1367+
}
1368+
}
1369+
reach := make([]int, n) // reach[i] 表示从 i 出发可以到达的节点数
1370+
for i, bs := range vs {
1371+
reach[i] = bs.OnesCount()
1372+
}
1373+
return reach
1374+
}
1375+
13491376
// 最小环
13501377
// 传入邻接矩阵 weights
13511378
// weights[v][w] == inf 表示没有 v-w 边

0 commit comments

Comments
 (0)