思路:拓扑排序。这题算是拓扑排序扩展的标准例题,没学过的同学可以好好学学。具体来说就是从外向内进行食物链条数的传递,传递到最内层,也就是出度为0的节点,他们的食物链条数之和就是答案
注意:本题有个踩坑点,那就是孤立点,孤立点是没有食物链的,不能计入答案中。因此,我们就可以在答案初始化的时候,排除入度和出度都为0的点,只初始化入度为0,出度为非0的点
代码:
import sys
from collections import deque
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n, m = MII()
in_dig = [0] * (n + 1)
out_dig = [0] * (n + 1)
g = [[] for _ in range(n + 1)]
for _ in range(m):
u, v = MII()
g[u].append(v)
in_dig[v] += 1
out_dig[u] += 1
q = deque(i for i in range(1, n + 1) if in_dig[i] == 0)
ans = [0] * (n + 1)
for i in q:
if out_dig[i] != 0:
ans[i] = 1
while q:
for _ in range(len(q)):
u = q.popleft()
for v in g[u]:
ans[v] += ans[u]
in_dig[v] -= 1
if in_dig[v] == 0:
q.append(v)
res = 0
for i in range(1, n + 1):
res += ans[i] if out_dig[i] == 0 else 0
print(res)
t = 1
# t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号