题目大意:

给定一张无向无权图,每次给定若干个二元组\((x_i,y_i)\),定义点\(u\)满足条件,当且仅当存在\(i\),并满足\(dist(u,x_i)\leqslant y_i\)(\(dist(u,v)\)表示\(u,v\)两点的距离)。每次询问求满足条件的点个数。

解题思路:

在太阳西斜的这个世界里,置身天上之森。等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去、逐渐消逝的未来。我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘。————世界上最幸福的女孩

珂朵莉,最可爱了呢。

---

我们定义\(f[i][j]\)为从点\(i\)出发,最短路小于等于\(j\)的点的集合。这个可以用bitset压位存储。

计算\(f[i][j]\),我们首先要知道任意两点对间最短路,然后计算出从每个点出发,最短路恰好为\(j\)的点的集合。然后前缀或一遍就是\(f[i][j]\)。

计算都可以在\(O(\dfrac{n^3}{\omega})\)的复杂度内完成。

而求任意点对间最短路,就从每个点开始BFS一遍即可。时间复杂度\(O(n(n+m))\)。

最后处理询问的时候,就把每个\((x,y)\)对应的\(f[x][y]\)都取并集,然后求其中1的个数即可。时间复杂度\(O(\dfrac{n\sum a}{\omega})\)。

总时间复杂度\(O(n(n+m)+\dfrac{n^3+n\sum a}{\omega})\),空间复杂度\(O(\dfrac{n^3}{\omega})\)。

然后听说这道题卡前向星

似乎是由于访问连续内存会比较快的原因,用vector存边就跑的飞快,而前向星就T飞了。

C++ Code:

#include<bitset>
#include<cstdio>
#include<cctype>
#include<queue>
#include<vector>
#define N 1003
#ifdef ONLINE_JUDGE
struct istream{
char buf[23333333],*s;
inline istream(){
buf[fread(s=buf,1,23333330,stdin)]='\n';
fclose(stdin);
}
inline istream&operator>>(int&d){
d=0;
for(;!isdigit(*s);++s);
while(isdigit(*s))
d=(d<<3)+(d<<1)+(*s++^'0');
return*this;
}
}cin;
#else
#include<iostream>
using std::cin;
#endif
std::bitset<N>a[N][N];
int n,m,q,dis[N][N];
std::vector<int>G[N];
void bfs(int s,int*dis){
for(int i=1;i<=n;++i)dis[i]=1002;
static std::queue<int>q;
dis[s]=0;
for(q.push(s);!q.empty();){
int u=q.front();q.pop();
for(int i:G[u])
if(dis[i]==1002){
dis[i]=dis[u]+1;
q.push(i);
}
}
for(int i=1;i<=n;++i)
a[s][dis[i]].set(i);
for(int i=1;i<=n;++i)a[s][i]|=a[s][i-1];
}
int main(){
cin>>n>>m>>q;
while(m--){
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;++i)bfs(i,dis[i]);
while(q--){
std::bitset<N>ans;
int x,u,v;
cin>>x;
while(x--){
cin>>u>>v;
if(v>n)v=n;
ans|=a[u][v];
}
printf("%d\n",ans.count());
}
return 0;
}

  

最新文章

  1. web前端基础知识-(三)JavaScript基本操作
  2. Oracle监听小问题
  3. 什么是SQL注入
  4. jquery添加光棒效果的各种方式以及简单动画复杂动画
  5. idea maven mvn archetype:generate 速度缓慢问题(转)
  6. 四 GPU 并行编程的存储系统架构
  7. .NET使用NPOI读取Word模板并替换关键字并下载
  8. 如何用angularjs制作一个完整的表格之二__表格分页功能
  9. Android XML文档解析(一)——SAX解析
  10. Sql server 数据库 单用户切换为多用户
  11. Android 开发转型前端准备知识
  12. 原生JS—实现图片循环切换及监测鼠标滚动切换图片
  13. poj3270 &amp;&amp; poj 1026(置换问题)
  14. Python多线程操作
  15. Visual Studio Shortcuts
  16. golang打造基于mail的提醒服务
  17. javascript 点击触发复制功能
  18. 保持ssh连接长时间不断开的技巧
  19. hdu2888 二维ST表(RMQ)
  20. GetLastError()返回值列表

热门文章

  1. 新手玩个人server(阿里云)
  2. 第十七周自由练习项目——acm 学生最高最低成绩
  3. TiDB(1): server測试安装
  4. 如何将unity资源窗体中的文件一下所有折叠/打开
  5. EF学习笔记——生成自定义实体类
  6. 【Ubuntu】基本操作 (条目=11)
  7. luogu3358 最长k可重区间集问题 网络流
  8. 使用U-Boot的TFTP(远程/网络内核)
  9. Buildroot构建指南——工具链【转】
  10. Extension Methods (C# Programming Guide)