在PAT上可以分别用如下的堆优化Dijkstra算法做和BFS做。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1e3+10,M=1e5+10;
int h[N],e[M],ne[M],idx;
int dist[N];
bool st[N];
int n,L;
#define x first
#define y second
typedef pair<int,int> PII;
void add(int a,int b){
e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
//法一:虽然bfs在两个平台上都可以过,但是在PAT上的最后一个点比Dijkstra的慢
int bfs(int u){
queue<int> q;
memset(st,false,sizeof st);
q.push(u);
st[u]=true;
int res=0;
for(int c=0;c<L;c++){
int sz=q.size();
res+=sz;
for(int k=0;k<sz;k++){
int t=q.front();
q.pop();
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
if(!st[j]){
q.push(j);
st[j]=true;
}
}
}
}
return res+q.size()-1;
}
//法二:PAT上可以过,但ACWing上不可以
int dijkstra(int u){
memset(dist,0x3f,sizeof dist);
memset(st,false,sizeof st);
priority_queue<PII,vector<PII>,greater<PII>> heap;
dist[u]=0;
heap.push({0,u});
int res=0;
while(heap.size()){
auto p=heap.top();
heap.pop();
int t=p.y;
if(st[t]) continue;
if(dist[t]>L) break;
st[t]=true;
res++;
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
if(dist[j]>dist[t]+1){
dist[j]=dist[t]+1;
heap.push({dist[j],j});
}
}
}
res--;
return res;
}
int main(){
cin>>n>>L;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
int m;
scanf("%d",&m);
while(m--){
int j;
scanf("%d",&j);
add(j,i);
}
}
int k;
cin>>k;
while(k--){
int s;
scanf("%d",&s);
cout<<bfs(s)<<endl;
}
return 0;
}