题目大意:
第一行输入N和L,分别是N名用户,以及一条微博最多转发的次数L(即为图中的层数);接下来N行,每一行第一个数字是每个用户关注的人数num,再依次输入关注用户的编号;最后一行第一个数字是发微博的用户数K,随后依次输入这K个用户的编号。
要求换行输出最大的转发次数。注意每名用户只可以转发一次相同的微博,并且同一条微博,最多只可以被L人转发。
分析:
首先想到使用BFS遍历图,并记录层数的方法来解决问题。
建图过程:注意题干输入的是每名用户关注的人,编号为 i 的用户发出微博只有关注他的人才可以转发,而他关注的人不一定能转发。所以建图使用邻接表时,表中第 i 行的数,应是关注第 i 号用户的人,而不是 i 号用户关注的人
#include<bits/stdc++.h>
using namespace std;
int N,L,K;
vector<int> graph[1005];//建图
int BFS(int v){//广度优先遍历
int num=0,level[N+1]={0};//num表示转发的人数,level表示用户转发时所处的转发层数
bool visit[N+1]={false};//表示该用户是否已被访问过,即是否入过队
queue<int> q;
q.push(v);
visit[v]=true;
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=0;i<graph[t].size();i++){//搜索关注该用户的人auto i:graph[t] 这里的i输出的是是具体的用户编号值!!!
int u=graph[t][i];
if(visit[u]==false&&level[t]<L){//如果没有访问过且转发层数<L,更新相关信息
++num;
visit[u]=true;
level[u]=level[t]+1;
q.push(u);
}
}
}
return num;//返回转发人数
}
int main(){
scanf("%d%d",&N,&L);
for(int i=1;i<=N;++i){
int num,a;
scanf("%d",&num);
while(num--){
scanf("%d",&a);
graph[a].push_back(i);//注意这里是 i 号用户关注了 a 号用户,i号用户可以转发a号用户的微博
}
}
scanf("%d",&K);
while(K--){
int a;
scanf("%d",&a);
printf("%d\n",BFS(a));
}
return 0;
}
问题:
第一遍写的时候出现很奇怪的错误,一是已经定义 u=graph[ t ][ i ],但是编译的时候下一行报错:u没有被定义;二是,逻辑上代码没有问题,并且如果使用迭代器输出就正确,但是用 i 和for循环就出错。
最后发现是,上一层for循环,忘记给加中括号了,因为如果使用迭代器输出的话,就不需要使用u,那么for循环加不加括号就无所谓,但是如果我使用一般输出,for后面跟了两句,自然就有问题了。
启示:以前编程的时候也经常出现莫名其妙的错误,比如上次在idea写Java的时候,最后检查出来也是中括号的问题。所以以后最好在每一个for 后面都加上中括号,养成良好的编程习惯,减少低级错误的发生。