给出一张有向图 G(V,E) ,所有的边都是有向边,对于图上的一个点 v ,从 v 出发可以到达的点的集合记为 Sv ,特别地, v ∈ Sv,再定义一个点的集合 Tv:从Tv中的任意一个点出发,可以到达点 v ,特别地,v∈Tv简而言之,Sv是 v 能到的点的集合,而 Tv 是能到 v 的点的集合。
对于一个点 v ,如果 Tv中的点数严格大于 Sv 中的点数,那么 v 就是一个重要节点,输入一张图,输出图中重要节点的个数
数据范围:
, 
第一行输入两个数 n,m ,分别表示点数和边数。 接下来 m 行,每行两个数 u , v 。表示一条从 u 到 v 的有向边,输入中可能存在重边和自环。
输出一个数,重要节点的个数
4 3 2 1 3 1 1 4
2
样例解释:重要节点是1,4。
n, m = map(int, input().split())
ds, dt = {}, {} # ds,dt分别记录正向图,反向图
for i in range(1, n+1):
ds[i], dt[i] = set([i]), set([i])
for i in range(m):
x, y = map(int, input().split())
ds[x].add(y)
dt[y].add(x)
def bfs(x,d): # 使用bfs
res = 0
q = [x]
visited = [False]*(n+1)
visited[x] = True
while q:
cur = q.pop(0)
res += 1
for nxt in d[cur]:
if not visited[nxt]:
visited[nxt] = True
q.append(nxt)
return res
cnt = 0
for i in range(1,n+1):
if bfs(i,ds) < bfs(i,dt): cnt += 1
print(cnt)