46 lines
No EOL
1.1 KiB
Python
46 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)
|
|
ans = 0
|
|
for i in reversed(order):
|
|
if not used[i]:
|
|
stack = [i]
|
|
used[i] = 1
|
|
size = 0
|
|
while stack:
|
|
v = stack.pop()
|
|
size += 1
|
|
for to in gr[v]:
|
|
if not used[to]:
|
|
used[to] = 1
|
|
stack.append(to)
|
|
ans += min(size, 2)
|
|
print(ans) |