题目描述
需要找到所有的抖音红人,用户数为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);
}
}