列表

详情


NC14521. 珂朵莉的无向图

描述

珂朵莉给了你一个无向图,每次查询给t个点以及一个常数s,求有多少个图中的点距离给出的那t个点中至少一个距离 <= s

输入描述

第一行三个数表示n,m,q
之后m行每行两个数u,v表示有一条边位于u和v两个点之间
之后 2 x q 行表示询问
每次询问先输入两个数t,s
之后一行t个数,表示t个特殊点

输出描述

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

示例1

输入:

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 <= 109

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 616ms, 内存消耗: 3180K, 提交时间: 2020-05-12 14:16:49

#include<bits/stdc++.h>
using namespace std;

struct node
{
	int x,h;
}Q[5005];
vector<int>R[5005];
bool V[5005];
int main()
{
	int i,j,t,s,n,m,q,x,h,r,f,ans;
	scanf("%d%d%d",&n,&m,&q);
	while(m--)scanf("%d%d",&i,&j),R[i].push_back(j),R[j].push_back(i);
	while(q--)
	{
		scanf("%d%d",&t,&s);
		memset(V,0,sizeof(V)),ans=r=f=0;
		while(t--)
		{
			scanf("%d",&i);
			if(!V[i])V[i]=1,ans++,Q[r].x=i,Q[r++].h=0;
		}
		while(r!=f)
		{
			x=Q[f].x,h=Q[f++].h;
			for(i=0;i<R[x].size();i++)
			{
				j=R[x][i];
				if(h+1<=s&&!V[j])V[j]=1,ans++,Q[r].x=j,Q[r++].h=h+1;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

上一题