传送门

题意:
N个点,M条边,每一个环上的点两两有边相连。q次询问两点间最短距离。

题解:
构造圆方树,那么两点间距离感性认知一下就可以发现是树上两点间距离的一半。然后
dist(u,v)=(dep[u]+dep[v]-2*dep[lca])/2即可。
继续存板子。

代码:

#include<cstdio>
#include<algorithm>
#define maxn 200005
#define maxm 1400005
using namespace std;
int n,m,q,n1,a[maxn],head1[maxn],head2[maxn],ncnt,dfn[maxn],low[maxn],ccnt,stk[maxn],tp;
int siz[maxn],tid[maxn],rnk[maxn],fa[maxn],dep[maxn],son[maxn],top[maxn];
struct node { int v,nxt; } e[maxm];
void addedge(int head[],int u,int v)
{ncnt++;e[ncnt].v=v,e[ncnt].nxt=head[u];head[u]=ncnt;
}
void dfs(int u,int fa)
{dfn[u]=low[u]=++ccnt; stk[++tp]=u;for(int p=head1[u];p;p=e[p].nxt){int v=e[p].v;if(!dfn[v]){dfs(v,u); low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]){addedge(head2,u,++n1); addedge(head2,n1,u);do { addedge(head2,stk[tp],n1); addedge(head2,n1,stk[tp]); } while(stk[tp--]!=v);}}else if(v!=fa) low[u]=min(low[u],dfn[v]);}
}
void dfs1(int u,int f)
{fa[u]=f,siz[u]=1,dep[u]=dep[f]+1;for(int p=head2[u];p;p=e[p].nxt){int v=e[p].v;if(v==f) continue;dfs1(v,u); siz[u]+=siz[v];if(siz[v]>siz[son[u]]) son[u]=v;}
}
void dfs2(int u,int tp)
{top[u]=tp,tid[u]=++ccnt,rnk[ccnt]=u;if(!son[u]) return;dfs2(son[u],tp);for(int p=head2[u];p;p=e[p].nxt){int v=e[p].v;if(v!=fa[u]&&v!=son[u]) dfs2(v,v);}
}
int lca(int u,int v)
{while(top[u]!=top[v])if(dep[top[u]]<dep[top[v]]) v=fa[top[v]];else u=fa[top[u]];return dep[u]<dep[v]?u:v;
}
int main()
{scanf("%d%d%d",&n,&m,&q); n1=n;for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);addedge(head1,u,v); addedge(head1,v,u);}dfs(1,0); ccnt=0;dfs1(1,0); dfs2(1,1);while(q--){int u,v;scanf("%d%d",&u,&v);int lc=lca(u,v);printf("%d\n",(dep[u]+dep[v])/2-dep[lc]);}
}

CodeForces1046B Hyperspace Highways相关推荐

  1. CF1045C Hyperspace Highways(圆方树板子)

    CF1045C Hyperspace Highways 题目大意 给一张 n n n个点 m m m条边的图,保证若有一个环,一定是完全子图,多次询两个点之间的最短路径长度. 题解 如果会圆方树的可以 ...

  2. Codeforces 1045C Hyperspace Highways (看题解) 圆方树

    学了一下圆方树, 好神奇的东西呀. #include<bits/stdc++.h> #define LL long long #define fi first #define se sec ...

  3. [CF1045C]Hyperspace Highways

    题目大意:给一张$n$个点$m$条边的图,保证若有一个环,一定是完全子图,多次询问两个点之间的最短路径长度 题解:把完全子图缩成一个点,圆方树,方点权值设成$1$,圆点设成$0$即可. 卡点:数组开小 ...

  4. UVa 1393 (容斥原理、GCD) Highways

    题意: 给出一个n行m列的点阵,求共有多少条非水平非竖直线至少经过其中两点. 分析: 首先说紫书上的思路,编程较简单且容易理解.由于对称性,所以只统计"\"这种线型的,最后乘2即是 ...

  5. POJ 2485 - Highways(求最小生成树的最大权值-Kruskal算法)

    题目 Language:Default Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36414 Accept ...

  6. 【POJ 2485】 Highways

    [POJ 2485] Highways 最小生成树模板 Prim #includeusing namespace std;int mp[501][501]; int dis[501]; bool vi ...

  7. POJ 2485 Highways(最小生成树 Prim)

    Highways   大意:给你一个用邻接矩阵形式存储的有n个顶点的无向图,让你求它的最小生成树并求出在这个生成树里面最大的边的权值. 思路:用Prim求,判断条件改一下就行. PS:dis数组初始化 ...

  8. 【POJ - 2485 】Highways (最小生成树,Prim算法,瓶颈生成树)

    题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. ...

  9. 【POJ - 1751】Highways (最小生成树)

    题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor system ...

最新文章

  1. 多线程处理缓慢_华为昇腾,AI推理性能超越对手一倍:软件挖掘处理器全部潜力...
  2. 516%增长:微博如何熬过七年之痒?
  3. mysql 远程登陆不上
  4. python的self
  5. MVC5 + EF6 + Bootstrap3
  6. 8个树莓派超级计算机_6 个可以尝试的树莓派教程
  7. 用C语言设置程序开机自启动
  8. 【编译原理】:NFA转变为DFA的子集构造法
  9. 各年龄段都是怎么提加薪的?
  10. 八个有价值的消费者心理
  11. Win10+Android+夜神安卓模拟器 搭建ReactNative开发环境
  12. Layui环境下form表单提交;jquery.form.js;lay-verify,lay-filter;
  13. 内含扩容源码的面试题,目标是手写HashMap!
  14. 技术文档 | 5G系统连接管理:CM空闲和CM已连接
  15. 分享一个简单易用的python并行模块【PP模块】
  16. c语言指数爆炸月球,指数爆炸:一张纸对折103次后,将填满整个宇宙?
  17. php生成本地word文件怎么打开,php生成word文件的简单范例
  18. PAT (Advanced Level) Practis 1039 Course List for Student (25)
  19. 景区夜游项目如何成功规划设计
  20. 信息时代的两极:重数量的百度,重质量的知乎

热门文章

  1. matlab 四舍五入、取整
  2. font:综合设置字体样式 (重点)
  3. 用golang写socks5代理服务器2-ssh远程代理
  4. Yii自定义加载配置文件
  5. 【BZOJ2006】【NOI2010】超级钢琴(堆)
  6. SSM+基于SSM的课堂考勤管理系统的设计与实现 毕业设计-附源码191617
  7. matlab 卷积神经网络工具,CNN卷积神经网络MATLAB工具箱中文注释版
  8. 中国食用菌市销售态势与竞争趋势预测报告(新版)2022-2027年
  9. android 广播 onreceive能干什么,Android BroadcastReceiver onReceive()在android 4.0上调用了两次...
  10. 最小的Linux系统制作过程详解