BFS——珂朵莉的无向图
题目描述
珂朵莉给了你一个无向图,每次查询给t个点以及一个常数s,求有多少个图中的点距离给出的那t个点中至少一个距离 <= s
输入描述:
第一行三个数表示n,m,q
之后m行每行两个数u,v表示有一条边位于u和v两个点之间
之后 2 x q 行表示询问
每次询问先输入两个数t,s
之后一行t个数,表示t个特殊点
输出描述:
q行,每行一个数表示答案
示例
输入
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
输出
3
2
4
3
4
4
说明
n,m,q<= 5000 ,t的和<= 500000, s <= 1e9
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn=5050;
int vis[maxn],f[maxn];
int n,m,s,num,w,t;
queue<int> q;
vector<int> a[maxn];
int bfs()
{
int cnt=0;
while(!q.empty()){
cnt++;
int x=q.front();
q.pop();
for(int i=0;i<a[x].size();i++){
int to=a[x][i];
if(!vis[to]){
vis[to]=1;
f[to]=f[x]+1;
if(f[to]<=s){
q.push(to);
}
}
}
}
return cnt;
}
int main()
{
cin>>n>>m>>w;
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
for(int i=0;i<w;i++){
memset(vis,0,sizeof(vis));
memset(f,0,sizeof(f));
cin>>t>>s;
for(int j=0;j<t;j++){
int x;
cin>>x;
if(!vis[x]){
q.push(x);
vis[x]=1;
}
}
int ans=bfs();
cout<<ans<<endl;
}
return 0;
}