码迷,mamicode.com
首页 > 其他好文 > 详细

PAT1076. Forwards on Weibo (30)

时间:2016-04-06 16:55:27      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

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



	

  

 

PAT1076. Forwards on Weibo (30)

标签:

原文地址:http://www.cnblogs.com/yellowman/p/5359934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!