题目链接🔗:164. 可达性统计 - AcWing题库
分析:本题用bfs或者dfs也是可以做的,但是时间复杂度相对较高,这里我们使用位运算。
思路是这样的:如果点A能到点BCDE,且点F与点A相连,那么一定有F也可以到ABCDE。因此,我们只需要将表示两个点可达性的列表按位与一下即可。
详见代码注释。
N,M = map(int,input().split())
Map = [[0 for i in range(N+1)]for j in range(N+1)] # 表示连通性
flag = [[False for i in range(N+1)]for j in range(N+1)] # 每个点的可达性
def check(lst1,lst2) :
tmp = [False for i in range(N+1)] # 存放答案的临时列表
for i in range(1,N+1) :
if lst1[i] or lst2[i] : # 对于i这个点,两个被check的点中有一个与i可达则tmp可达
tmp[i] = True
return tmp
for i in range(M) :
a,b = map(int,input().split())
Map[a][b] = 1 # 两点相互可达
for i in range(N,0,-1) :
flag[i][i] = True # 自己和自己可达
for j in range(1,N+1) :
if Map[i][j] : # 若两点可达
flag[i] = check(flag[i],flag[j])
for i in range(1,N+1) :
print(flag[i].count(True))