链接:https://www.nowcoder.com/acm/contest/82/E
来源:牛客网
题目描述
有一个n个点的无向图,有m次查询,每次查询给出一些(xi,yi)
令dist(x,y)表示x和y点在图中最短距离,dist(x,x)=0,如果x,y不连通则dist(x,y) = inf
每次查询图中有多少个点v与至少一个这次询问给出的(xi,yi)满足dist(v,xi)<=yi
输入描述:
第一行三个数表示n,m,q
之后m行每行两个数x,y表示有一条x与y之间的边,边权为1
之后q次询问,每个询问先给你一个数a
之后一行2a个数,第2i-1个数xi和第2i个数yi表示一个二元组(xi,yi)
输出描述:
输出q行,每行一个数表示这次询问的答案
开个二维bitset[i][dis],记录距i点<=dis距离的所有点
广搜求出任意x到y的最小距离,存入bitset中,同时[i][dis+1]可以继承[i][dis]的状态
查询时直接输出对应y的1的个数即可
bitset真好用(逃
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
vector<int>g[N];
bitset<N>B[N][N];
int dis[N][N],n,m,q;
void BFS(int s)
{
for(int i=1;i<=n;i++)
dis[s][i]=n;
queue<int>q;
q.push(s);
dis[s][s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(dis[s][v]>dis[s][u]+1)
{
dis[s][v]=dis[s][u]+1;
q.push(g[u][i]);
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int x,y,a;
cin>>n>>m>>q;
for(int i=0;i<m;i++)
{
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
BFS(i);
for(int j=1;j<=n;j++)
B[i][dis[i][j]][j]=1;
for(int j=1;j<=n;j++)
B[i][j]|=B[i][j-1];
}
while(q--)
{
cin>>a;
bitset<N>res;
while(a--)
{
cin>>x>>y;
res|=B[x][y];
}
cout<<res.count()<<endl;
}
return 0;
}