题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1076
解题感悟:题目挺有意思的,一道典型的图论题,要注意到超时问题
代码如下:
#include <cstdio>//用BFS加链表存储,不要用DFS+存储矩阵
#include <queue>
#include <list>
using namespace std;
struct Node{
int id;
int level;
Node(){}
Node(int tid,int tlevel):id(tid),level(tlevel){}
};
list<int> linklist[1001];
int visit[1001];
int n,l;
queue<Node> q;
int main()
{
freopen("C:\\Users\\Devon\\Desktop\\input.txt","r",stdin);
scanf("%d%d",&n,&l);
for(int i=1;i<=n;i++){
int temp;
scanf("%d",&temp);
for(int j=0;j<temp;j++){
int temp2;
scanf("%d",&temp2);
linklist[temp2].push_back(i);
}
}
int k;
scanf("%d",&k);
for(int i=0;i<k;i++){
int temp;
scanf("%d",&temp);
for(int j=1;j<=n;j++) visit[j]=0;;
while(!q.empty()) q.pop();
q.push(Node(temp,0));
int ret=0;
while(!q.empty()){
Node temp=q.front();
q.pop();
int tid=temp.id;
visit[tid]=1;
int tlev=temp.level;
if(tlev>l) break;
ret++;
for(list<int>::iterator it=linklist[tid].begin();it!=linklist[tid].end();it++){
if(!visit[*it]) visit[*it]=1,q.push(Node(*it,tlev+1));
}
}
printf("%d\n",ret-1);
}
return 0;
}