PAT甲级1076

题目大意:
第一行输入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 后面都加上中括号,养成良好的编程习惯,减少低级错误的发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值