【数据结构算法】有向图的遍历应用--抖音网红

题目

‘’’
需要找到所有的抖音红人,用户数为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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值