PAT (Advanced Level) Practice 1076 Forwards on Weibo (30 分)
阿新 • • 發佈:2018-11-26
因為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;
}