A1076 Forwards on Weibo (30) 图的遍历BFS

本题思路
考虑转发,且有层数(即转发最多通过几个非直接follows),所以考虑用BFS,因为BFS不涉及递归之类的,所以要用Node设置layer值。

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1010;
struct node
{
	int layer;
	int id;
};
vector<int> ans;
bool vis[maxn]={false};
vector<node>adj[maxn];
int G[maxn][maxn];
void BFS(int l,int id,int &num)
{
	vis[id]=true;
	queue<node> q;
	node temp;
	temp.id=id;
	temp.layer=0;
	q.push(temp);
	while(!q.empty())
	{
		temp=q.front();
		q.pop();
	    int u=temp.id;
	    for(int i=0;i<adj[u].size();i++)
	    {
	    	node v=adj[u][i];
	    	v.layer=temp.layer+1;
	    	if(v.layer<=l&&vis[v.id]==false)
	    	{
	    		q.push(v);
	    		vis[v.id]=true;
	    		num++;
			}
		}
	}
}
int main()
{
	int n,l,num,id,k;
	node user;
	cin>>n>>l;
	for(int i=1;i<=n;i++)
	{
		user.id=i;
		scanf("%d",&num);
		for(int j=1;j<=num;j++)
		{
			scanf("%d",&id);
			adj[id].push_back(user);
		}
	}
	cin>>k;
	for(int i=0;i<k;i++)
	{
		memset(vis,false,maxn);
		scanf("%d",&id);
		num=0;
		BFS(l,id,num);
		ans.push_back(num);
	}
	for(int i=0;i<ans.size();i++)
	{
		printf("%d\n",ans[i]);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值