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

48 lines
No EOL
1.1 KiB
Python

import sys
input = sys.stdin.readline
line = input().split()
if not line:
sys.exit()
n, m = map(int, line)
g = [[] for _ in range(n + 1)]
gr = [[] for _ in range(n + 1)]
for _ in range(m):
u, v = map(int, input().split())
g[u].append(v)
gr[v].append(u)
used = [0] * (n + 1)
order = []
head = [0] * (n + 1)
for i in range(1, n + 1):
if not used[i]:
stack = [i]
used[i] = 1
while stack:
v = stack[-1]
if head[v] < len(g[v]):
to = g[v][head[v]]
head[v] += 1
if not used[to]:
used[to] = 1
stack.append(to)
else:
stack.pop()
order.append(v)
used = [0] * (n + 1)
comp = [0] * (n + 1)
c = 1
for i in reversed(order):
if not used[i]:
stack = [i]
used[i] = 1
comp[i] = c
while stack:
v = stack.pop()
for to in gr[v]:
if not used[to]:
used[to] = 1
comp[to] = c
stack.append(to)
c += 1
print(c - 1)
print(" ".join(map(str, comp[1:])))