74 lines
No EOL
1.8 KiB
Python
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) |