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;
}



	

  

 

posted @ 2016-04-06 16:39  Yellowman  阅读(529)  评论(0编辑  收藏  举报
TVRBMExqRXlPQzR5TXpjdU1UVTEK\n