微博被称为Twitter的中文版。微博上的一个用户可能有很多关注者,也可能关注许多其他用户。因此,形成了具有追随者关系的社交网络。当用户在微博上发布帖子时,他/她的所有关注者都可以查看并转发他/她的帖子,然后他们的关注者可以再次转发。现在给定一个社交网络,假设只计算了L级间接关注者,则应该计算任何特定用户的最大潜在转发量。
输入规格:
每个输入文件包含一个测试用例。对于每种情况,第一行包含2个正整数:N(≤1000),用户数;和L(≤6),即被计数的间接关注者的级别数。因此,假设所有用户的编号都从1到N。然后是N行,每行的格式为:
M [i]个用户列表[i]
其中M [i](≤100)是用户[i]跟随的总人数; user_list [i]是紧随user [i]的M [i]个用户的列表。保证没有人可以跟随自己。所有数字都用空格分隔。
然后,最后给出一个正数K,后跟K个用户ID进行查询。
输出规格:
对于每个UserID,假定每个可以查看初始帖子的用户都将转发一次,并且只计算L个级别的间接关注者,则应该在一行中打印出该用户可以触发的最大潜在转发量。
输入样例:
7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6
样本输出:
4
5
思路:
一开始以为每一行是别人关注了自己,没想到是自己关注了别人,刚开始把图的边给存反了。因为是被关注者指向关注者。
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
struct node{
int u;
int deep;
node(int a,int b){u=a;deep=b;}
};
const int maxn=1050;
int n,l; //l为最大深度
int k,x;
vector<node> g[maxn]; //存图
bool inq[maxn]={false}; //是否入队
int bfs(int lay,int s) //最大深度lay
{
queue<node> q; //队列,如果队列放外面,要记得每次bfs时把队列清空
int num=0; //总的转发数
q.push(node(s,0)); //起点入队
inq[s]=1; //标记入过队
while(!q.empty())
{
int u=q.front().u; //取出队首的u
int deep=q.front().deep; //当前深度
q.pop(); //记得pop
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].u; //第一个关注者
if(inq[v]==false && deep+1<=lay) //下一深度要小于lay
{
num++; //总转发数增加
q.push(node(v,deep+1)); //入队,深度+1
inq[v]=1; //入过队
}
}
}
return num;//返回数量
}
int main()
{
cin>>n>>l;
for(int i=1;i<=n;i++)
{
cin>>k;
for(int j=0;j<k;j++)
{
cin>>x;
g[x].push_back(node(i,0)); //被关注着->关注着
}
}
cin>>k;
for(int i=0;i<k;i++)
{
cin>>x;
fill(inq,inq+maxn,0); //把入队情况初始化
int ans=bfs(l,x);
cout<<ans<<endl;
}
return 0;
}