PAT1076 原题题目大意及思路代码运行截图收获 原题 题目大意及思路 给出了一个有向图,给定一个数,找出在l步内能到达它的节点个数(不重复)这里我采用了队列实现BFS,通过一个 exist数组对已经访问的结点进行剪枝,优化了时间性能。 代码 #include<iostream> #include<vector> #include<queue> #include<unordered_set> using namespace std; const int maxn=1009; vector<int> Adj[maxn]; struct node{ int index,layer; }; int BFS(bool *exist,int index,int l){ unordered_set<int> ans; queue<node> q; q.push({index,0}); exist[index]=true; while(!q.empty()){ node top=q.front(); q.pop(); if(top.layer<l){ for(int i=0;i<Adj[top.index].size();i++){ if(exist[Adj[top.index][i]]==false){ q.push({Adj[top.index][i],top.layer+1}); exist[Adj[top.index][i]]=true; ans.insert(Adj[top.index][i]); } } } } return ans.size(); } int main(){ int n,l; cin>>n>>l; for(int i=1;i<=n;i++){ int m; cin>>m; for(int j=0;j<m;j++){ int e; cin>>e; Adj[e].push_back(i); } } int k; cin>>k; while(k--){ bool exist[maxn]={false}; int index; cin>>index; int ans=BFS(exist,index,l); printf("%d\n",ans); } } 运行截图 收获