PAT (Advanced Level) Practice 1076 Forwards on Weibo (30 分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84347455

因为level在1到L层内的都需要计数,所以用bfs,一开始用dfs,发现有些远的点被提前遍历到了,导致有更短的路径时会忽略这个节点,导致答案错误,而bfs每次都是先遍历距离最短的点,所以这个错误就不会出现了。

#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

const int N=1e3+5;

struct Node
{
    int u,dis;
};

int n,l,now,vis[N];
vector<int> G[N];

int bfs(int s)
{
    queue<Node> q;
    q.push({s,0});
    vis[s]=now;
    int cnt=0;
    while(!q.empty())
    {
        Node u=q.front();
        q.pop();
        if(u.dis>=1) cnt++;
        for(int i=0;i<G[u.u].size();i++)
        {
            int v=G[u.u][i];
            if(vis[v]==now) continue;
            vis[v]=now;
            if(u.dis+1<=l) q.push({v,u.dis+1});
        }
    }
    return cnt;
}

int main()
{
    scanf("%d%d",&n,&l);
    for(int i=1;i<=n;i++)
    {
        int m;scanf("%d",&m);
        while(m--)
        {
            int x;scanf("%d",&x);
            G[x].push_back(i);
        }
    }
    int q;scanf("%d",&q);
    now=0;
    while(q--)
    {
        now++;
        int x;scanf("%d",&x);
        printf("%d\n",bfs(x));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Nightmare_ak/article/details/84347455