题目:
微博被称为中文版的 Twitter。
微博上的用户既可能有很多关注者,也可能关注很多其他用户。
因此,形成了一种基于这些关注关系的社交网络。
当用户在微博上发布帖子时,他/她的所有关注者都可以查看并转发他/她的帖子,然后这些人的关注者可以对内容再次转发…
现在给定一个社交网络,假设只考虑 LL 层关注者,请你计算某些用户的帖子的最大可能转发量。
补充
如果 BB 是 AA 的关注者,CC 是 BB 的关注者,那么 AA 的第一层关注者是 BB,第二层关注者是 CC。
输入格式
第一行包含两个整数,NN 表示用户数量,LL 表示需要考虑的关注者的层数。
假设,所有的用户的编号为 1∼N1∼N。
接下来 NN 行,每行包含一个用户的关注信息,格式如下:
M[i] user_list[i]
M[i] 是第 ii 名用户关注的总人数,user_list[i] 是第 ii 名用户关注的 M[i] 个用户的编号列表。
最后一行首先包含一个整数 KK,表示询问次数,然后包含 KK 个用户编号,表示询问这些人的帖子的最大可能转发量。
输出格式
按顺序,每行输出一个被询问人的帖子最大可能转发量。
假设每名用户初次看到帖子时,都会转发帖子,只考虑 LL 层关注者。
数据范围
1≤N≤10001≤N≤1000,
1≤L≤61≤L≤6,
1≤M[i]≤1001≤M[i]≤100,
1≤K≤N
本题 关键是掌握层数要小于等于l
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1e4+10,M = 1e6+10;
int q[N];
int e[M],ne[M],h[N],idx;
int dist[N];
bool st[N];
int n,l;
void add(int a,int b)
{
e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}
int bfs(int u)
{
memset(st,0,sizeof st);
memset(dist,0,sizeof dist);
int hh = 0,tt=0;
q[0] = u;
st[u] = true;
int cnt = 0;
int res= 0;
while(hh<=tt)
{
int t=q[hh++];
if(dist[t]>l) return res;
for(int i = h[t];~i;i=ne[i])
{
int j= e[i];
if(st[j]) continue;
dist[j] = dist[t]+1;
if(dist[j]<=l) res++;
q[++tt] = j;
st[j] = true;
}
}
return res;
}
int main()
{
scanf("%d%d",&n,&l);
memset(h,-1,sizeof h);
for(int i = 1; i<=n;i++)
{
int cnt;
scanf("%d",&cnt);
while(cnt--)
{
int id;
scanf("%d",&id);
add(id,i);
}
}
int k;
scanf("%d",&k);
while(k--)
{
int a;
scanf("%d",&a);
printf("%d\n",bfs(a));
}
return 0;
}
标签:dist,int,用户,st,bfs,关注,层数,点到
From: https://www.cnblogs.com/freshman666/p/17174537.html