import sys
""" 并查集的完整结构,由于python该死的性能开销问题,只能抽取主干直接在函数内实现了(rank和排序部分也可以不管,反正不是多次处理加上极端情况的话是大树接小树还是小树接大树区别没那么大)
class UnionFind:
def __init__(self, sets):
self.parent = {}
self.rank = {}
for x in sets:
self.parent[x] = x
self.rank[x] = 0
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
root_x = self.find(x)
root_y = self.find(y)
if root_x == root_y:
return
# 按秩合并
if self.rank[root_x] < self.rank[root_y]:
root_x, root_y = root_y, root_x
self.parent[root_y] = root_x
if self.rank[root_x] == self.rank[root_y]:
self.rank[root_x] += 1
"""
def main():
data = sys.stdin.buffer.read().split() # 一次性全读,虽然后面获取数据的逻辑会更复杂,但不这样时间可能不够
t = int(data[0])
idx = 1
out_lines = []
for _ in range(t):
if idx >= len(data):
break
n = int(data[idx])
idx += 1
# 手动直接实现并查集,不然时间不够
parent = {}
def find(x):
if x not in parent:
parent[x] = x
return x
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
valid = True
enemies = []
# 边读边处理
for i in range(n):
# 获取数据
u = int(data[idx])
v = int(data[idx+1])
rel = int(data[idx+2])
idx += 3
if rel == 1: # 朋友关系
ru = find(u)
rv = find(v)
if ru != rv:
parent[ru] = rv
else: # 敌人关系
enemies.append((u, v))
# 检查敌人关系
for u, v in enemies:
if find(u) == find(v):
valid = False
break
out_lines.append("YES" if valid else "NO")
sys.stdout.write("\n".join(out_lines))
if __name__ == "__main__":
main()
要查询那就不能直接BFS或DFS了,只能上并查集
但也算是真体会到python的限制了,解释型语言还是有极限的,所以我不用python了!(误)

京公网安备 11010502036488号