1. 程式人生 > >pat甲級-1076(bfs)

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