题目
‘’’
需要找到所有的抖音红人,用户数为N,关注关系有M对。(A,B)代表A关注了B。关注关系具有传递关系,比如有(A,B)(B,C),那么认为A间接关注了C。如果一个用户被所有N个用户直接或间接关注,那么我们认为这个用户就是抖音红人。求抖音红人的总数。
输入:**
第一行,整数N
第二行,整数M
第三行,M*2个整数,代表M个关注关系
这一题是一个有向图的遍历问题
‘’’
解题思路
数据是一个有向图,(A,B)代表A关注B,那么在这条关系在图中,存B指向A(这里给出解释:这个一题其实一个有向图的遍历问题,站在网红的角度就是从我开始可以到达所有的人,所以要把边进行反向)。
import sys
# 广度优先搜索
def BFS(G,visited,v_s):
for v_n_idx, e in enumerate(G[v_s]):
if e and not visited[v_n_idx]:
visited[v_n_idx]=True
BFS(G, visited, v_n_idx)
if __name__=="__main__":
N = int(sys.stdin.readline().strip())
M = int(sys.stdin.readline().strip())
# 采用矩阵表示有向图,注意(A,B) 边是B->A 因为我们是站在网红的角度
arrs=list(map(int,sys.stdin.readline().strip().split()))
G=[[False]*N for _ in range(M)]
for i in range(M):
i = i*2
v1, v2 = arrs[i]-1, arrs[i+1]-1
G[v2][v1] = True
num_hot=0
for v_s in range(N):
visited=[False]*N
visited[v_s]=True
BFS(G, visited, v_s)
if sum(list(map(int,visited)))==N:
num_hot+=1
print(num_hot)