【算法练习】图/dfs/抖音红人

题目描述

  需要找到所有的抖音红人,用户数为N,关注关系有M对。(A,B)代表A关注了B。关注关系具有传递关系,比如有(A,B)(B,C),那么认为A间接关注了C。如果一个用户被所有N个用户直接或间接关注,那么我们认为这个用户就是抖音红人。求抖音红人的总数。
输入:**
第一行,整数N
第二行,整数M
第三行,M*2个整数,代表M个关注关系
输出:
整数
样例输入:
3
3
1 2 2 1 2 3
样例输出:
1
 

思路:

建图:A关注B,建立一条B指向A的边

每个节点都dfs,用fans数组记录

public class Solution {
    boolean[] visit;
    int[] fans;
    public void dfs(List<List<Integer>> graph,int origin,int i){
        visit[i] = true;
        for(int adj:graph.get(i)){
            if(visit[adj]==false) {
                fans[origin]++;
                dfs(graph,origin,adj);
            }
        }
        visit[i] = false;
    }
    //输入节点数n=3
    //关注对  {1 2 2 1 2 3} m=3
    //求关注数超过k的人数 或者list
    public void findPeople(int n,int m,int[] list,int k){
        //构建有向图  邻接表存图
        //输入从1开始 存图从0开始
        List<List<Integer>> graph = new ArrayList<>();
        visit = new boolean[n];
        fans = new int[n];
        Arrays.fill(fans,1);  //初始化1 默认自己关注了自己
        for(int i=0;i<n;i++){
            graph.add(new ArrayList<>());
        }
        for(int i=0;i<m;i++){
            int a = list[2*i];
            int b = list[2*i+1];
            graph.get(b-1).add(a-1);  //a关注b  b指向a 被关注->粉丝
        }

        for(int i=0;i<n;i++){
            dfs(graph,i,i);
        }
        return;
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        /* 测试用例
        n=3
        关注对  {1 2 2 1 2 3} m=3

        */
        int[] list = {1,2,2,1,2,3};
        s.findPeople(3,3,list,2);

    }

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值