Re: [闲聊] 每日leetcode

楼主: JIWP (JIWP)   2024-06-30 18:38:04
1579. Remove Max Number of Edges to Keep Graph Fully Traversable
有一个无像图包含n个node
并且有3种边
TYPE1:只有ALICE可以通过
TYPE2:只有BOB可以通过
TYPE3:两个人都可以通过
edges告诉你有那些边:edges[i]=[type_i,u_i,v_i]
请问做多可以删掉几条边后,2个人还是可以从任意node抵达所有node
如果没办法则回传-1
思路:
照着hint的想法做下去
用union find
分别建立bob跟alice的并查表
(1)先把第三种type的边建立起来
(2)接着再去用其他两种边把没联通的点接起来
(1)、(2)都要记录用了几条边
最后检查两人的每个点是不是都有连通
没有就回传-1
有就回传所有边的数量-用掉的边
golang code :
func maxNumEdgesToRemove(n int, edges [][]int) int {
alice := make([]int, n+1)
bob := make([]int, n+1)
cnt := 0
for i := 1; i <= n; i++ {
alice[i] = i
bob[i] = i
}
for _, val := range edges {
if val[0] == 3 && find(val[1], &alice) != find(val[2], &alice) {
merge(val[1], val[2], &alice)
cnt++
}
}
for i := 1; i <= n; i++ {
bob[i] = alice[i]
}
for _, val := range edges {
if val[0] == 1 && find(val[1], &alice) != find(val[2], &alice) {
merge(val[1], val[2], &alice)
cnt++
}
if val[0] == 2 && find(val[1], &bob) != find(val[2], &bob) {
merge(val[1], val[2], &bob)
cnt++
}
}
for i := 1; i <= n; i++ {
if find(i, &bob) != 1 || find(i, &alice) != 1 {
return -1
}
}
return len(edges) - cnt
}
func find(node int, arr *[]int) int {
if node != (*arr)[node] {
(*arr)[node] = find((*arr)[node], arr)
}
return (*arr)[node]
}
func merge(a, b int, arr *[]int) {
parent1 := find(a, arr)
parent2 := find(b, arr)
if parent1 < parent2 {
(*arr)[parent2] = parent1
} else {
(*arr)[parent1] = parent2
}
}
作者: aioiwer318 (哀欧)   2024-06-30 18:42:00
别卷了
作者: DJYOMIYAHINA (通通打死)   2024-06-30 18:43:00
剩我看到hard就躺平了
作者: sustainer123 (caster)   2024-06-30 18:49:00
我等等也来卷一下好了
作者: CanIndulgeMe (CIM)   2024-06-30 18:52:00
技术大神
作者: oin1104 (是oin的说)   2024-06-30 18:52:00
别卷了 送我模型

Links booklink

Contact Us: admin [ a t ] ucptt.com