PAT1076. Forwards on Weibo (30)
使用DFS出现超时,改成bfs
DFS
#include <iostream> #include <vector> #include <set> using namespace std; int n; int l; int i,j; int m,k; int follower[1001][1001]; vector<int> user_list[1001]; set<int> user_s; void queryU(int a,int depth){ if(depth==l){ return ; } for(int i=0;i<user_list[a].size();i++){ queryU(user_list[a][i],depth+1); user_s.insert(user_list[a][i]); } return ; } int main() { cin>>n>>l; int a; for(i=1;i<=n;i++){ cin>>m; for(j=0;j<m;j++){ cin>>a; user_list[a].push_back(i); } } cin>>k; int sum; for(i=0;i<k;i++){ cin>>a; user_s.clear(); user_s.insert(a); queryU(a,0); cout<<user_s.size()-1<<endl; } return 0; }
bfs
最后一个测试用例一直MLE,后来用指针优化,就报超时了。
后来参考 https://www.zhihu.com/question/28264519,把队列删除语句省掉,set省掉,终于AC了!
#include <iostream> #include <vector> #include <set> using namespace std; int n; int l; int i,j; int m,k; vector<int> user_list[1010]; vector<int> que; int v[1005]; int main() { cin>>n>>l; int a; for(i=1;i<=n;i++){ cin>>m; for(j=0;j<m;j++){ cin>>a; user_list[a].push_back(i); } } cin>>k; for(i=1;i<=k;i++){ cin>>a; v[a]=i; int depth=0; que.clear(); que.push_back(a); int levelSize=0; int count=1; for(int z=0;z<que.size();z++){ int num=que[z]; count--; vector<int> *tmp=&user_list[num]; levelSize+=tmp->size(); for(int y=0;y<tmp->size();y++){ int temp_num=(*tmp)[y]; if(v[temp_num]!=i){ que.push_back(temp_num); v[temp_num]=i; } } if(count==0){ count=levelSize; levelSize=0; depth++; } if(depth==l){ break; } } cout<<que.size()-1<<endl; } return 0; }