pat甲级-1076(bfs)

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805392092020736

总结:先开始,题目没读懂(看来还要好好学英语)

题目大意是这样的,微博的博客可以被你的粉丝转发,你的粉丝又可以转发,就形成了一张复杂的网络。

输入n(总人数),len(最多扩展的深度)输入n行,

每行输入一个k表示第i个人的粉丝人数,和k个人的编号,

最后输入k然后输入k个x询问每次最多可以扩展的人数。

可以用广搜来做,就是要注意深度的判断。一开始我用了两个队列,发现超时,

后来参考了网上的代码,发现可以将vis变为深度,这样既能判断某个节点是否走过,

也能知道当前的深度,以便于结束bfs(妙啊)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 1200;
int a[maxn][maxn],vis[maxn],len,n;
queue <int> q;
int bfs(int x)
{
	memset(vis,-1,sizeof(vis));
	int cnt=0,i,j,num=0;
	vis[x]=0;
	while(!q.empty()) q.pop();
	q.push(x);
	while(!q.empty())
	{
		int tp=q.front();
		q.pop();
		cnt=vis[tp];
		if(cnt>=len) break;
		for(i=1;i<=n;i++)
		{
			if(vis[i]==-1&&a[tp][i])
			{
				vis[i]=cnt+1;
				q.push(i);
				num++;
			}
		}
	}
	return num;
}
int main(void)
{
	int i,j,k,x,y;
	scanf("%d%d",&n,&len);
	memset(a,0,sizeof(a));
	for(i=1;i<=n;i++)
	{
		scanf("%d",&k);
		for(j=0;j<k;j++) scanf("%d",&x),a[x][i]=1;
	}
	scanf("%d",&k);
	for(j=0;j<k;j++)
	{
		scanf("%d",&x);
		printf("%d\n",bfs(x));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/83999191