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