pat甲级1076 图的广度优先遍历

遍历到特定层

#include <cstdio>
#include <queue>

using namespace std;

const int maxv = 1001;

int N, L;
int graph[maxv][maxv] = {};

//以vex为起点,广度优先遍历L层,返回顶点数
int BFS(int vex, int L);

int main(){
    scanf("%d%d", &N, &L);
    for(int i=1; i<=N; i++){
        int t, f;
        scanf("%d", &t);
        while(t--){
            scanf("%d", &f);
            graph[f][i] = 1;
        }
    }
    int K;
    scanf("%d", &K);
    int ans[K];
    for(int i=0; i<K; i++){
        int vex;
        scanf("%d", &vex);
        ans[i] = BFS(vex, L);
    }
    for(int i=0; i<K; i++){
        printf("%d", ans[i]);
        if(i<K-1) printf("\n");
    }

    return 0;
}

int BFS(int vex, int L){
    queue<int> q;
    bool inq[maxv] = {}; //多个查询,inq要重置
    q.push(vex);
    inq[vex] = true;
    //当前正在访问第layer层,入队第layer+1层
    //当前层还有cur_layer个点没访问,下一层顶点统计有nex_layer个
    //顶点总数为v_count
    int cur_layer=1, nex_layer=0, layer=0, v_count=0;
    while(!q.empty() && layer<L){
        int v = q.front();
        q.pop();
        cur_layer--;
        for(int i=1; i<=N; i++){
            if(!inq[i] && graph[v][i]!=0){
                q.push(i);
                inq[i] = true;
                v_count++;
                nex_layer++;
            }
        }
        if(cur_layer==0){
            layer++;
            cur_layer = nex_layer;
            nex_layer = 0;
        }
    }
    return v_count;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值