1076 Forwards on Weibo ——PAT甲级真题
1076 Forwards on Weibo
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 thatuser[i]
follows; anduser_list[i]
is a list of theM[i]
users that followed byuser[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
题目大意:让你计算一个人发一条微博的最多转发数量,给定正整数n,l,k。其中n代表一共有n个人,每个人的编号为1~n,l表示能够转发的最大层数。给出n组数据代表第i个人关注了哪些人。最后给出k组查询,让你求出这个人发一条微博最多能转发多少条。
大致思路:题目给出了明显的层次关系,显然是让我们用BFS去搜索,在定义一个数组 level
用来记录每一个结点坐在的层数 level[子节点] = level[父节点] + 1
。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<vector<int>> graph;
int n, l, k;
int level[N];
bool vis[N];
inline int BFS(int st) {
memset(vis, 0, sizeof(vis));
queue<int> q;
q.push(st);
vis[st] = true;
level[st] = 0;
int cnt = -1; //第一层不计算在内
while(!q.empty()) {
int t = q.front(); q.pop();
if (level[t] > l) break;
cnt++;
for (int i = 0; i < graph[t].size(); i++) {
int tmp = graph[t][i];
if (!vis[tmp]) {
vis[tmp] = true;
level[tmp] = level[t] + 1;
q.push(tmp);
}
}
}
return cnt;
}
int main() {
// freopen("in.txt", "r", stdin);
scanf("%d%d", &n, &l);
graph.resize(n + 1);
for (int i = 1; i <= n; i++) {
int m; scanf("%d", &m);
while(m--) {
int x; scanf("%d",&x);
graph[x].push_back(i);
}
}
scanf("%d", &k);
while(k--) {
int q; scanf("%d",&q);
int ans = BFS(q);
printf("%d\n", ans);
}
return 0;
}