PAT 甲级 A1076 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 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

题意:

一个微博里面有n(7)个用户,每个用户可以相互关注,用户关注列表里面的人转发说说,用户可以接收得到(有向图,被关注(发说说)->关注者),给出转发层次L(3),转发的层次不能超过L,然后下列给出第i个人的关注列表(依据这个可以建造图),最后一行给出k个人,这k个人是编写说说的人,求在不超过转发层次的情况下,转发的人数有多少(给出连通块内的一个元素求连通块内元素个数)。

思路:
根据条件建造有向图,BFS遍历有向图;

注意点:

①题目给出的是用户i的关注列表,关注表内的用户发信息,用户i是接收方,

因此是被关注->关注。

②每个连通块应该做到互不影响。

代码:
 

#include<iostream>
#include<vector>
#include<queue>
#include<cstring> 
using namespace std;

struct Node {
	int id;
	int layer;
};
const int maxn = 1010;
vector<Node> Adj[maxn]; 
bool vis[maxn] = {false};
int n, m, k, id, L, releaseId;

int BFS(int releaseId, int L) {//挖掘连通块; 
	int numForward = 0;
	vis[releaseId] = true; 
	queue<Node> q;
	Node sourse;
	sourse.id = releaseId;//初始化; 
	sourse.layer = 0;
	q.push(sourse);
	while(!q.empty()) {
		Node now = q.front();
		q.pop();
		for(int i = 0; i < Adj[now.id].size(); i++) {
			Node next = Adj[now.id][i];
			next.layer = now.layer + 1;
			if(vis[next.id] == false && next.layer <= L) {
				q.push(next);
				vis[next.id] = true;
				numForward++;
			}
		}
	}
	return numForward; 
}

int main () {
	scanf("%d %d", &n, &L);//微博内的人数,和说说转发层次限制;
	for(int i = 1; i <= n; i++) {
		scanf("%d", &m);//用户i关注了m个人;
		for(int j = 0; j < m; j++) {
			scanf("%d", &id);//关注列表的人的id;
			Node node;
			node.id = i;
			Adj[id].push_back(node);//因为是关注的人转发信息,被关注的人接收,所以应该是Id(被关注)>i; 
		} 
	}
	scanf("%d", &k);//查询人数(遍历连通块个数);
	for(int i = 0;i < k; i++) {
	memset(vis, false, sizeof(vis));//遍历每个连通块都需要初始化,以免相互影响; 
	
	scanf("%d", &releaseId);//转发信息源(连通块的一个点);
	int numForward = BFS(releaseId, L);//遍历releaseId所在的连通块,找出在L限制下的转发人数; 
	printf("%d\n",numForward);
	} 
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值