给出一张有向图 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)