Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is formed with followers relations. When a user makes a post on Weibo, all his/her followers can view and forward his/her post, which can then be forwarded again by their followers. Now given a social network, you are supposed to calculate the maximum potential amount of forwards for any specific user, assuming that only L levels of indirect followers are counted.
Input Specification:
Each input file contains one test case. For each case, the first line contains 2 positive integers: N (≤1000), the number of users; and L (≤6), the number of levels of indirect followers that are counted. Hence it is assumed that all the users are numbered from 1 to N. Then N lines follow, each in the format:
M[i] user_list[i]
where M[i] (≤100) is the total number of people that user[i] follows; and user_list[i] is a list of the M[i] users that followed by user[i]. It is guaranteed that no one can follow oneself. All the numbers are separated by a space.
Then finally a positive K is given, followed by K UserID’s for query.
Output Specification:
For each UserID, you are supposed to print in one line the maximum potential amount of forwards this user can trigger, assuming that everyone who can view the initial post will forward it once, and that only L levels of indirect followers are counted.
Sample Input:
7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6
Sample Output:
4
5
解题思路:
本题类似于上一篇博客的题“六度空间”,都是利用BFS去统计层数。设置一个变量last记录本层最后一个进入队列的元素, 变量l记录下一层最后一个进入队列的元素。当本层的last出队列时,本层全部出队列,level++,更新last(即last= l);当level等于规定层数时,break出来,输出传播量。
需要注意两点:
1、编号从1开始存储,数组容量不是1000而是1001
2、本题采用邻接表存储图更方便些。加入元素时不是构建每个人所关注的人的邻接表,而是构建每个人被谁谁谁关注的邻接表。即是
Adj[people].push_back(i)而不是Adj[i].push_back(people);
源代码如下:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
vector<int> Adj[1001];
int N,L;
int FOW(int u){
int num = 0;
bool inq[1001] = {false};
int last,l;
int level = 0;
queue<int> q;
q.push(u);
inq[u] = true;
last = u;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = 0;i<Adj[u].size();i++){
int v = Adj[u][i];
if(inq[v]==false){
q.push(v);
inq[v] = true;
l = v;
num++;
}
}
if(u==last){
last = l;
level++;
}
if(level==L){
break;
}
}
return num;
}
int main()
{
cin>>N;
cin>>L;
int i;
int n;int people;
for(i= 1;i<N+1;i++){
cin>>n;
for(int j = 0;j<n;j++){
cin>>people;
Adj[people].push_back(i);
}
}
int Check_n;int index;
cin>>Check_n;
for(i = 0;i<Check_n;i++){
cin>>index;
cout<<FOW(index)<<endl;
}
}