1076 Forwards on Weibo

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1076 Forwards on Weibo相关的知识,希望对你有一定的参考价值。

1. 这题说的是,微博上人们之间有关注和被关注的关系,如果一个人发博,他的追随者就可能转发,追随者的追随者又可能转发,以此类推。现在给定一个人,求其微博可能被转发的人数,但是注意有一个关注链长的上限,超过这个上限认为不会再转发。可见要有层数这个属性。

2. 本题在BFS专题下,但是不需要两个BFS函数,因为不用考虑图是不是强连通图,对于每一个人,关注他所在的强连通子图就好了,所以只需要一个BFS函数。

3. 由于BFS不像DFS有嵌套,所以很多变量是局部还是全局,判断顺序的先后要求都没那么高了,因为不会有覆盖问题。

4. 注意读清楚题目,我设置的邻接矩阵G[i][j]表示i的粉丝是j,但是读入的时候给出的是每个人的追随对象。不要弄反了。

这是例题的图示

 AC代码

#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
typedef long long LL;

using namespace std;

const int maxn = 1010;//总人数上限 

int totalNum,maxL;

bool G[maxn][maxn] = {0};

int BFS(int idx){
	int layer[maxn] = {0};//层数
	int forwards = 0;//可能的转发数
	bool inq[maxn] = {0};//已经入队的下标  
	queue<int> Q;
	Q.push(idx);
	inq[idx] = 1;
	while(!Q.empty()){
		int now = Q.front();
		Q.pop();
		for(int k=1;k<=totalNum;k++){
			if(G[now][k]==1&&inq[k]==0){
				layer[k] = layer[now]+1;
				if(layer[k]<=maxL){
					Q.push(k);
					inq[k]=1;
					forwards++;
				}else break;	
			}	
		}
	}
	return forwards;

} 

int main(){

	 scanf("%d %d",&totalNum,&maxL);
	 for(int i=1;i<=totalNum;i++){
	 	int num;
	 	scanf("%d",&num);
	 	for(int k=0;k<num;k++){
	 		int j;
	 		scanf("%d",&j);
	 		G[j][i] = 1;// i追随很多j 
		 }
	 }
	 
	 int qNum;
	 scanf("%d",&qNum);
	 while(qNum--){
	 	int idx;
	 	scanf("%d",&idx);  
	 	printf("%d\\n",BFS(idx));
	 }
	
	
	return 0;
}

 

以上是关于1076 Forwards on Weibo的主要内容,如果未能解决你的问题,请参考以下文章

1076 Forwards on Weibo[BFS][一般]

1076. Forwards on Weibo (30)树+搜索——PAT (Advanced Level) Practise

PAT1076. Forwards on Weibo (30)

PAT A1076 Forwards on Weibo (30 分)——图的bfs

PAT1076. Forwards on Weibo(标准bfs模板)

PAT Advanced 1076 Forwards on Weibo (30) [图的遍历,BFS,DFS]