defunion(self, x: int, y: int, w: int) -> bool: rx, ry = self.find(x), self.find(y) dx, dy = self.dis[x], self.dis[y] if rx == ry: # x 和 y 在同一集合,不做合併 return (dy ^ dx) == w
if self.sz[rx] < self.sz[ry]: # fa[rx] = ry # rx <------- ry # | | # | dx | dy # ↓ ↓ # x --------> y # => pot(rx) - pot(ry) = dy - w - dx self.fa[rx] = ry self.dis[rx] = dy ^ w ^ dx self.sz[ry] += self.sz[rx] else: # fa[ry] = rx # rx -------> ry # | | # | dx | dy # ↓ w ↓ # x --------> y # => pot(ry) - pot(rx) = w - dy + dx self.fa[ry] = rx self.dis[ry] = w ^ dy ^ dx self.sz[rx] += self.sz[ry] returnTrue
defsolve() -> None: n, q = map(int, input().split())
edges = [] deg = [0] * n for _ inrange(n - 1): u, v = map(lambda x: int(x) - 1, input().split()) edges.append((u, v)) deg[u] += 1 deg[v] += 1
uf = UnionFind(n) for _ inrange(q): u, v, x = map(int, input().split()) u, v = u - 1, v - 1 ifnot uf.union(u, v, x): print("No") return
d = uf.dis parity = [0] * n s = 0 for u inrange(n): fu = uf.find(u) if deg[u] & 1: s ^= d[u] parity[fu] ^= 1
# 避免在 uf.dis 上修改破壞 uf 的結構,複製一份。 # 注意需要在前面的路徑壓縮完成後複製才能保證正確性。 d = d.copy() if s != 0: for u inrange(n): if uf.find(u) == u and parity[u] == 1: for v inrange(n): if uf.find(v) == u: d[v] ^= s break
ans = [d[u] ^ d[v] for u, v in edges] print("Yes") print(*ans, sep=" ")