Newcoder 38 D.珂朵莉的无向图(bfs)

本文介绍了一种基于无向图的查询算法,通过给定的点集合和距离限制,计算图中满足条件的点的数量。使用BFS遍历整张图,时间复杂度为O((n+m)q),适用于处理大规模图数据查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

珂朵莉给了你一个无向图,每次查询给ttt个点以及一个常数sss,求有多少个图中的点距离给出的那ttt个点中至少一个距离≤s\le ss

Input

第一行三个数表示n,m,qn,m,qnmq

之后mmm行每行两个数u,vu,vuv表示有一条边位于uuuvvv两个点之间

之后 2q2 q2q 行表示询问

每次询问先输入两个数t,st,sts

之后一行ttt个数,表示ttt个特殊点

(1≤n,m,q≤5000,∑t≤5⋅105,s≤109)(1\le n,m,q\le 5000,\sum t\le 5\cdot 10^5,s\le 10^9)(1n,m,q5000,t5105,s109)

Output

qqq行,每行一个数表示答案

Sample Input

5 6 6
2 3
1 3
2 5
1 3
3 2
2 5
1 1
3
1 1
1
1 4
1
1 2
5
1 4
1
1 4
5

Sample Output

3
2
4
3
4
4

Solution

每次以所给ttt个点为起点bfsbfsbfs整张图即可,时间复杂度O((n+m)q)O((n+m)q)O((n+m)q)

Code

#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int maxn=5005;
int n,m,q,dis[maxn],vis[maxn];
vector<int>g[maxn];
int main()
{
	scanf("%d%d%d",&n,&m,&q);
	while(m--)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v),g[v].push_back(u);
	}
	while(q--)
	{
		int t,s;
		scanf("%d%d",&t,&s);
		for(int i=1;i<=n;i++)dis[i]=s+1,vis[i]=0;
		queue<int>que;
		for(int i=1;i<=t;i++)
		{
			int u;
			scanf("%d",&u);
			que.push(u);
			dis[u]=0;
			vis[u]=1;
		}
		while(!que.empty())
		{
			int u=que.front();
			que.pop();
			if(dis[u]==s)break;
			for(int i=0;i<g[u].size();i++)
			{
				int v=g[u][i];
				if(vis[v])continue;
				vis[v]=1,dis[v]=dis[u]+1,que.push(v);
			}
		}
		int res=0;
		for(int i=1;i<=n;i++)
			if(dis[i]>s)res++;
		printf("%d\n",n-res);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值