'''
Description:
Autor: Au3C2
Date: 2021-01-27 10:36:46
LastEditors: Au3C2
LastEditTime: 2021-01-27 10:37:23
'''
# 并查集模板
class UnionFind:
def __init__(self, n: int):
self.parent = list(range(n))
self.size = [1] * n
self.n = n
# 当前连通分量数目
self.setCount = n
def findset(self, x: int) -> int:
if self.parent[x] == x:
return x
self.parent[x] = self.findset(self.parent[x])
return self.parent[x]
def unite(self, x: int, y: int) -> bool:
x, y = self.findset(x), self.findset(y)
if x == y:
return False
if self.size[x] < self.size[y]:
x, y = y, x
self.parent[y] = x
self.size[x] += self.size[y]
self.setCount -= 1
return True
def connected(self, x: int, y: int) -> bool:
x, y = self.findset(x), self.findset(y)
return x == y
class Solution:
def maxNumEdgesToRemove(self, n: int, edges: List[List[int]]) -> int:
ufa, ufb = UnionFind(n), UnionFind(n)
ans = 0
# 节点编号改为从 0 开始
for edge in edges:
edge[1] -= 1
edge[2] -= 1
# 公共边
for t, u, v in edges:
if t == 3:
if not ufa.unite(u, v):
ans += 1
else:
ufb.unite(u, v)
# 独占边
for t, u, v in edges:
if t == 1:
# Alice 独占边
if not ufa.unite(u, v):
ans += 1
elif t == 2:
# Bob 独占边
if not ufb.unite(u, v):
ans += 1
if ufa.setCount != 1 or ufb.setCount != 1:
return -1
return ans
# 并查集,困难,每日一题。直接放弃
# https://leetcode-cn.com/problems/remove-max-number-of-edges-to-keep-graph-fully-traversable/