0
点赞
收藏
分享

微信扫一扫

1076 Forwards on Weibo

耶也夜 2022-03-18 阅读 25

算是我做的第一道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 = 1000;
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];
			next.layer = topNode.layer + 1;
			if(next.layer > 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);
	}
	/*check Adj[i][j]
	for(int i=0; i<N; i++){
		for(int j=0; j<Adj[i].size(); j++)
			cout << Adj[i][j].val<<  " ";
		cout << endl;
	}*/
}
举报

相关推荐

0 条评论