1076 Forwards on Weibo (30 分)
题目大意
给出每个用户关注的人的id,和转发最多的层数,求一个id发了条微博最多会有多少人转发(某个人发了条微博,所有关注他的人都会转发,这样就能获得这个人的微博被转发量的最大值)(包括直接转发+间接转发)
基本思路
带层数的广度优先遍历,在每一个bfs中,因为每个用户都只能转发一次,所以用inq判断当前结点是否入过队,入过队的不能重复入队(重复转发消息),数组inq和邻接表v可以值存储用户编号,queue的数据类型必须为node,在一个node中保存他的编号和层号(间接转发不超过l层),用cnt统计最终的转发次数然后返回。
代码
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int maxn=1005;
//每个人(编号,层号)为一个结点
struct node{
int id;
int layer;//因为转发有层数的限制,超过l层的不算
};
int n,l;//人数,最多转发层数
vector<int> v[maxn];//下标为人的编号,值为直接转发他微博的人的编号
//对某个人进行bfs,求出这个人的微博被多少人转发(直接+间接)
int bfs(node tnode){
queue<node> q;
bool inq[maxn]={false};
q.push(tnode);
inq[tnode.id]=true;
int cnt=0;//有几个人转发了他的微博(直接+间接)
while(!q.empty()){
node top=q.front();
q.pop();
int topid=top.id;
for(int i=0;i<v[topid].size();i++){
int tid=v[topid][i];
if(inq[tid]==false&&top.layer<l){
node tnode=node{tid,top.layer+1};
q.push(tnode);
inq[tid]=true;
cnt++;
}
}
}
return cnt;
}
int main(){
cin>>n>>l;
// v.resize(n+1);
/*构建邻接表:枚举每个编号,看看这个人转发了哪几个人的微博,
并在那几个人的邻接表中加上这个人的编号。*/
for(int i=1;i<=n;i++){
int ans;
cin>>ans;
while(ans--){
int tid;
cin>>tid;
v[tid].push_back(i);
}
}
//对测试样例中的每个编号进行bfs,求出这个人的微博被多少人转发(直接+间接,最多转发层次为l)
int num;
cin>>num;
for(int i=0;i<num;i++){
int tid;
cin>>tid;
node tnode=node{tid,0};
cout<<bfs(tnode)<<endl;
}
}