AcWing 240. 食物链-python3
原题链接
中等
作者:
机械佬也想学编程
,
2020-06-30 00:42:23
,
所有人可见
,
阅读 664
参考秦同学
res = 0
n, k = map(int, input().split())
sp = [i for i in range(3*n+1)] # x, x+n, x+n+n分别代表 同类, x的食物, x的天敌
def find(x):
if sp[x] != x:
sp[x] = find(sp[x])
return sp[x]
def merge(x, y):
sp[find(x)] = find(y)
for i in range(k):
d, x, y = map(int, input().split())
if x > n or y > n:
res += 1
else:
if d == 1: # 判断x和y为同一类是否为真话
if find(x) == find(y+n) or find(x) == find(y+n+n): #如果x和y的食物是同一类或x与y的天敌是同一类
res += 1
else:
merge(x, y) # 将x和y归到同一类
merge(x+n, y+n) # 将x的食物和y的食物归到同一类
merge(x+n+n, y+n+n) # 将 x的天敌和y的天敌归到同一类
else: # 判断x吃y是否为真话
if x == y or find(x) == find(y) or find(x) == find(y+n): # x和y是同一个动物或x和y是同一类或x和y的食物是同一类
res += 1
else:
merge(x, y+n+n) # 将x和y的天敌归到同一类
merge(x+n, y) # 将x的食物和y归到同一类
merge(x+n+n, y+n) # 将x的天敌和y的食物归到同一类
print(res)