test/1N.py
2026-07-01 19:46:51 +03:00

74 lines
No EOL
1.8 KiB
Python

import sys
data = sys.stdin.read().split()
if not data:
exit()
n = int(data[0])
m = int(data[1])
adj_all = [[] for _ in range(n + 1)]
adj2 = [[] for _ in range(n + 1)]
rev_adj2 = [[] for _ in range(n + 1)]
edges2 = []
idx = 2
for _ in range(m):
u = int(data[idx])
v = int(data[idx+1])
t = int(data[idx+2])
idx += 3
adj_all[u].append(v)
if t == 2:
adj2[u].append(v)
rev_adj2[v].append(u)
edges2.append((u, v))
reachable = [False] * (n + 1)
reachable[1] = True
q = [1]
head = 0
while head < len(q):
u = q[head]
head += 1
for v in adj_all[u]:
if not reachable[v]:
reachable[v] = True
q.append(v)
visited = [False] * (n + 1)
order = []
edge_idx = [0] * (n + 1)
stack = []
for i in range(1, n + 1):
if not visited[i]:
visited[i] = True
stack.append(i)
while stack:
u = stack[-1]
if edge_idx[u] < len(adj2[u]):
v = adj2[u][edge_idx[u]]
edge_idx[u] += 1
if not visited[v]:
visited[v] = True
stack.append(v)
else:
order.append(u)
stack.pop()
scc_id = [0] * (n + 1)
current_scc = 0
for i in range(n - 1, -1, -1):
start_node = order[i]
if scc_id[start_node] == 0:
current_scc += 1
q_scc = [start_node]
scc_id[start_node] = current_scc
head_scc = 0
while head_scc < len(q_scc):
u = q_scc[head_scc]
head_scc += 1
for v in rev_adj2[u]:
if scc_id[v] == 0:
scc_id[v] = current_scc
q_scc.append(v)
ans = "No"
for u, v in edges2:
if reachable[u] and scc_id[u] != scc_id[v]:
ans = "Yes"
break
print(ans)