[Luogu4320]

必经点数==圆方树上两点路径上圆点数

也就等于边数/2+1

没什么好说的 , 看代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define debug(...) fprintf(stderr,__VA_ARGS__)
  6. #define Debug(x) cout<<#x<<"="<<x<<endl
  7. using namespace std;
  8. typedef long long LL;
  9. const int INF=1e9+7;
  10. inline LL read(){
  11. register LL x=0,f=1;register char c=getchar();
  12. while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
  13. while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
  14. return f*x;
  15. }
  16. const int N=1e6+5;
  17. const int M=2e6+5;
  18. struct Graph{
  19. struct Edge{
  20. int v,nxt;
  21. }e[M];
  22. int first[N],Ecnt=0;
  23. inline void Add_edge(int u,int v){
  24. e[++Ecnt]=(Edge){v,first[u]};
  25. first[u]=Ecnt;
  26. }
  27. inline void link(int u,int v){
  28. Add_edge(u,v);
  29. Add_edge(v,u);
  30. }
  31. }G,T;
  32. int low[N],dfn[N],st[N],size[N],fa[N],top[N],son[N],dep[N];
  33. int n,m,Q,dft,tp;
  34. inline void tarjan(int u){
  35. dfn[u]=low[u]=++dft;
  36. st[++tp]=u;
  37. for(int i=G.first[u];i;i=G.e[i].nxt){
  38. int v=G.e[i].v;
  39. if(!dfn[v]){
  40. tarjan(v);
  41. low[u]=min(low[u],low[v]);
  42. if(low[v]>=dfn[u]){
  43. T.link(++n,u);
  44. while(st[tp]!=v) T.link(n,st[tp--]);
  45. T.link(n,st[tp--]);
  46. }
  47. }
  48. else low[u]=min(low[u],dfn[v]);
  49. }
  50. }
  51. inline void dfs1(int u,int pre){
  52. dep[u]=dep[pre]+1,fa[u]=pre,size[u]=1;
  53. for(int i=T.first[u];i;i=T.e[i].nxt){
  54. int v=T.e[i].v;
  55. if(v==pre) continue;
  56. dfs1(v,u);
  57. size[u]+=size[v];
  58. if(size[v]>size[son[u]]) son[u]=v;
  59. }
  60. }
  61. inline void dfs2(int u,int tp){
  62. top[u]=tp;
  63. if(son[u]){
  64. dfs2(son[u],top[u]);
  65. }
  66. for(int i=T.first[u];i;i=T.e[i].nxt){
  67. int v=T.e[i].v;
  68. if(v==fa[u]||v==son[u]) continue;
  69. dfs2(v,v);
  70. }
  71. }
  72. inline int LCA(int x,int y){
  73. while(top[x]!=top[y]){
  74. if(dep[top[x]]<dep[top[y]]) swap(x,y);
  75. x=fa[top[x]];
  76. }
  77. if(dep[x]<dep[y]) return x;
  78. return y;
  79. }
  80. int main(){
  81. n=read(),m=read();
  82. for(int i=1;i<=m;i++){
  83. int x=read(),y=read();
  84. G.link(x,y);
  85. }
  86. tarjan(1);
  87. dfs1(1,0);
  88. dfs2(1,1);
  89. Q=read();
  90. while(Q--){
  91. int x=read(),y=read(),p=LCA(x,y);
  92. printf("%d\n",(dep[x]+dep[y]-2*dep[p])/2+1);
  93. }
  94. }

P4320 道路相遇的更多相关文章

  1. 【刷题】洛谷 P4320 道路相遇

    题目描述 在 H 国的小 w 决定到从城市 \(u\) 到城市 \(v\) 旅行,但是此时小 c 由于各种原因不在城市 \(u\),但是小 c 决定到在中途与小 w 相遇 由于 H 国道路的原因,小 ...

  2. [洛谷P4320]道路相遇

    题目大意:基本同上一题[bzoj5329][Sdoi2018]战略游戏,只是每个点集内只有两个点,且只有一组询问而已.(双倍经验?我反正就直接改了一下代码就交了) 题解:同上一题(链接见“题目大意”) ...

  3. 【洛谷 P4320】 道路相遇 (圆方树,LCA)

    题目链接 题意:给一张无向图和\(M\)个询问,问\(u,v\)之间的路径的必经之点的个数. 对图建出圆方树,然后必经之点就是两点路径经过的原点个数,用\((dep[u]+dep[v]-dep[LCA ...

  4. Solution -「洛谷 P4320」道路相遇

    \(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的连通无向图,并给出 \(q\) 个点对 \((u,v)\),询问 \(u\) 到 ...

  5. 【luogu4320】道路相遇 (圆方树 + LCA)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,保证无重边无自环, 共\(~q~\)组询问求\(~x~\)到\(~y~\)的路径上必经的点数. Solution ​ ...

  6. luoguP4320 道路相遇 圆方树

    标题已经告诉你怎么做了..... 两点间的圆点个数即为所求 建出圆方树后打个树剖求$lca$就行..... 复杂度$O(n + q \log n)$ #include <cstdio> # ...

  7. 图论杂项细节梳理&模板(虚树,圆方树,仙人掌,欧拉路径,还有。。。)

    orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...

  8. [bzoj5329] P4606 [SDOI2018]战略游戏

    P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...

  9. 仙人掌&圆方树

    仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略 ...

随机推荐

  1. 轻量级的同步机制——volatile语义详解(可见性保证+禁止指令重排)

    目录 1.关于volatile 2.语义一:内存可见性 2.1 一个例子 2.2 java的内存模型(JMM) 2.3 happens-before规则 2.4 volatile解决内存可见性问题的原 ...

  2. HTML5样式、链接和表格

    -------------------siwuxie095 HTML5 样式 1.标签 <style> 标签:样式定义 <link> 标签:资源引用 2.属性 rel:用于指定 ...

  3. cocos+kbe问题记录

    1.不要使用setTimeout函数 setTimeout函数,setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 是HTML DOM中的方法,在游戏中使用,属于全局的延时,当游 ...

  4. Linux设置串口波特率等参数

    转自 http://blog.csdn.net/zoomdy/article/details/50921336 mingdu.zheng at gmail dot com stty查看串口参数 stt ...

  5. c语言实践 用1角 2角 5角 凑成10元钱的方法

    /* 用1角,2角,5角凑出10元钱,有几种办法. 也就是0.1a+0.2b+0.3c=10,化简一下就是 a=100-2b-3c 因为a的范围是0到100,所以弄一个循环 把a的值从0尝试到100, ...

  6. JavaPersistenceWithMyBatis3笔记-第5章Configuring MyBatis in a Spring applications-001

    一. 1.Mapper /** * */ package com.mybatis3.mappers; import java.util.List; import org.apache.ibatis.a ...

  7. [GO]切片和底层数组的关系

    package main import "fmt" func main() { a := [], , , , , , , , , } s1 := a[:] s1[] = fmt.P ...

  8. springcloud 实现微服务间调用

    package com.idoipo.ibt.config; import org.apache.http.HttpException; import org.apache.http.HttpRequ ...

  9. 课后练习Javascript

    <script type="text/javascript"> alert (isNaN(prompt("输入个数字进来","只能输入数字 ...

  10. 今天遇到的传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确的解决方案

    传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确.参数 3 ("@UserName"): 数据类型 0xE7 的数据长度或元数据长度无效. 今天在做数据同步的时候遇 ...