我是仙人掌 社论
闲话被虎哥扬了,哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!
遂水篇博客 .
珂朵莉给你一个无向图,每次查询的时候给一堆二元组 .
求图中有多少个点 与至少一个这次询问给出的二元组 满足 , 表示这两个点在图中的距离 .
如果不连通 .
,, .
首先 遍 BFS 求出全源最短路 .
然后我们就可以算出从每个点 出发,最短路恰好为 的点的集合,前缀或一遍就可以得到不大于 的集合(用 std :: bitset
存一下).
询问的时候直接 bitset
暴力并一下即可,时间复杂度
代码(2021/7/13):
using namespace std;
const int N=1234;
vector<int> g[N];
bitset<N> F[N][N];
int n,m,q,dis[N];
void addedge(int u,int v){g[u].push_back(v);}
void bfs(int x)
{
for (int i=1;i<=n;i++) dis[i]=2222;
queue<int> q; q.push(x); dis[x]=0;
while (!q.empty())
{
int u=q.front(),s=g[u].size(); q.pop();
for (int i=0;i<s;i++)
{
int v=g[u][i];
if (dis[v]==2222){dis[v]=dis[u]+1; q.push(v);}
}
}
for (int i=1;i<=n;i++) F[x][dis[i]].set(i);
for (int i=1;i<=n;i++) F[x][i]|=F[x][i-1];
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for (int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),addedge(u,v),addedge(v,u);
for (int i=1;i<=n;i++) bfs(i);
int a;
while (q--)
{
scanf("%d",&a);
bitset<N> ans;
for (int i=1,u,v;i<=a;i++){scanf("%d%d",&u,&v); ans|=F[u][v];}
printf("%d\n",int(ans.count()));
} return 0;
}
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16595699.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误