1076 Forwards on Weibo

算是我做的第一道30分题目吧。

题意

在微博中,每个用户都可能被若干个其他用户关注。而当该用户发布一条信息时,他的关注者就可以看到这条信息并选择是否转发它,且转发的信息也可以被转发者的关注者再次转发,但同一用户最多只转发该信息一次(信息的最初发布者不会转发该信息)。现在给出N个用户的关注情况(即他们各自关注了哪些用户)以及一个转发层数上限L,并给出最初发布消息的用户编号,求在转发层数上限内消息最多会被多少用户转发。

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

图例

请添加图片描述

思路

统计L层转发的人数,就是在BFS中统计层数在L下的节点数量
1.建图,用邻接表,如上图
2.用dfs处理时,注意每次遇到新的开始节点,要复原inq[]

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct Node{
	int val;	//节点编号 
	int layer;	//节点层号 
	Node(int v, int lay):val(v), layer(lay){}//初始化函数 
};
int N, L;		//节点个数,最大转发层数 
const int maxv = 1005; 
vector<Node> Adj[maxv];//邻接表 
bool inq[maxv] = {false};//是否加入过队 
int cnt;				//统计量 

void BFS(int u){
	int flag = 0;
	queue<Node> q;
	Node start(u, 0);	//定义起始节点,下面二句等效 
	//start.val = u;
	//start.layer = 0;
	q.push(start);			//节点入队 
	inq[start.val] = true;	//标记入队 
	while(!q.empty()){
		Node topNode = q.front();q.pop();//头节点出队 
		int s = topNode.val;			//头节点编号 
		for(int i=0; i<Adj[s].size(); i++){ 
			Node next = Adj[s][i];		//从s出发能到达的所有节点next 
			next.layer = topNode.layer + 1;//下层节点层数+1 
			if(next.layer > L){			//下层超过L,程序结束 
				flag = 1;
				break;
			}
			if(inq[next.val] == false){	//若未入队过 
				q.push(next);
				inq[next.val] = true;
				cnt++;
			}
		}
		if(flag == 1)
			break;
	}
	cout << cnt << endl;		//结果输出 
	for(int i=1; i<=N; i++){	//清零,下次还要用 
		for(int j=0; j<Adj[i].size(); j++)
			Adj[i][j].layer = 0;
	}
	for(int i=0; i<maxv; i++)	//清零,下次用,不受本次影响 
		inq[i] = false; 
}
int main(){
	cin >> N >> L;
	//构造邻接表 
	for(int i=1; i<=N; i++){
		int mi, temp;
		cin >> mi;
		for(int j=0; j<mi; j++){
			cin >> temp;
			Adj[temp].push_back(Node(i,0));
		}
	}
	//输入K个开始节点start 
	int k, start;
	cin >> k;
	for(int i=0; i<k; i++){
		cin >> start;
		cnt = 0;
		BFS(start);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值