LINK:最短路

一张仙人掌图 求图中两点最短路。

\(n<=10000,Q<=10000,w>=1\)

考虑边数是多少 m>=n-1 对于一张仙人掌图 考虑先构建出来dfs树 非树边会形成环 环不可能相交 也没有自环 那么说一每形成一个环需要一条树边和非树边。

所以m<=2n-2.

求图中两点最短路。离线做也不太好做。考虑一下一个点到另外一个点 会经过一些割点 必经之点 那么任意两个割点之间的最短路有两条。

显然其中一条永远没用 考虑构建出圆方树 边权dfs的时候处理一下即可。求距离树上求LCA即可。

不知道哪里挂了 回来再调。

4.6 update:闲来无事拍了一下 发现了自己的思想漏洞。

之前少处理了一种情况 考虑一个环内 两点各自的儿子之间的最短距离。

他们的LCA为方点 这说明了要爬到这个环内然后然后 对于环有两条路径 所以需要特判 我之前只注意到环内点了 所以挂了。

正确的是 判LCA 然后x向上跳 y向上跳 然后计算距离即可。

计算环的距离时我暴力了一点 求了一发 L 和 R数组.

  1. const int MAXN=20010;
  2. int n,m,Q,len=1,cnt,top,sum,len1,id,cc;
  3. int dfn[MAXN],low[MAXN],s[MAXN],f[MAXN][20],a[MAXN],b[MAXN],Log[MAXN],L[MAXN],R[MAXN];
  4. int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1],e[MAXN<<1],d[MAXN],dis[MAXN],w[MAXN],h[MAXN];
  5. int lin1[MAXN],ver1[MAXN<<1],nex1[MAXN<<1],e1[MAXN<<1];
  6. inline void add(int x,int y,int z){ver[++len]=y;nex[len]=lin[x];lin[x]=len;e[len]=z;}
  7. inline void add1(int x,int y,int z){ver1[++len1]=y;nex1[len1]=lin1[x];lin1[x]=len1;e1[len1]=z;}
  8. inline void solve(int x)
  9. {
  10. add1(x,id,0);
  11. rep(2,sum,i)
  12. {
  13. L[a[i]]=dis[a[i]]-dis[a[1]];R[a[i]]=b[a[i]]-dis[a[1]];
  14. if(i+1<=sum)
  15. {
  16. b[a[i+1]]=dis[a[i]]-dis[a[i+1]]+b[a[i]];
  17. //if(dis[a[i]]<=dis[a[i+1]])cout<<"ww"<<endl;
  18. }
  19. w[a[i]]=min(dis[a[i]],b[a[i]]);
  20. }
  21. rep(2,sum,i)add1(id,a[i],w[a[i]]-dis[a[1]]);
  22. }
  23. inline void dfs(int x)
  24. {
  25. dfn[x]=low[x]=++cnt;
  26. s[++top]=x;
  27. go(x)
  28. {
  29. if(!dfn[tn])
  30. {
  31. dis[tn]=dis[x]+e[i];
  32. h[tn]=i;dfs(tn);
  33. low[x]=min(low[x],low[tn]);
  34. if(low[tn]>=dfn[x])
  35. {
  36. int y=0;sum=0;
  37. a[++sum]=x;
  38. while(y!=tn)
  39. {
  40. y=s[top--];
  41. a[++sum]=y;
  42. }
  43. ++id;solve(x);
  44. }
  45. }
  46. else
  47. {
  48. low[x]=min(low[x],dfn[tn]);
  49. if((i^1)!=h[x])b[x]=dis[tn]+e[i];
  50. }
  51. }
  52. }
  53. inline void dfs(int x,int fa)
  54. {
  55. d[x]=d[fa]+1;f[x][0]=fa;
  56. rep(1,Log[d[x]],i)f[x][i]=f[f[x][i-1]][i-1];
  57. for(int i=lin1[x];i;i=nex1[i])
  58. {
  59. int tn=ver1[i];
  60. dis[tn]=dis[x]+e1[i];
  61. dfs(tn,x);
  62. }
  63. }
  64. inline int LCA(int x,int y)
  65. {
  66. if(d[x]<d[y])swap(x,y);
  67. fep(Log[d[x]],0,i)
  68. if(d[f[x][i]]>=d[y])x=f[x][i];
  69. if(x==y)return x;
  70. fep(Log[d[x]],0,i)
  71. if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
  72. return f[x][0];
  73. }
  74. inline int get_x(int x,int w)
  75. {
  76. fep(Log[d[x]],0,i)if(d[f[x][i]]>=w)x=f[x][i];
  77. return x;
  78. }
  79. int main()
  80. {
  81. freopen("1.in","r",stdin);
  82. get(n);get(m);get(Q);
  83. rep(1,m,i)
  84. {
  85. int x,y,z;
  86. get(x);get(y);get(z);
  87. add(x,y,z);add(y,x,z);
  88. b[i]=INF;
  89. }
  90. id=n;dfs(1);
  91. rep(2,id,i)Log[i]=Log[i>>1]+1;
  92. dfs(1,0);
  93. rep(1,Q,i)
  94. {
  95. int get(x);int get(y);
  96. int lca=LCA(x,y);
  97. if(lca>n)
  98. {
  99. int xx=get_x(x,d[lca]+1);
  100. int yy=get_x(y,d[lca]+1);
  101. if(L[xx]<L[yy])swap(xx,yy);
  102. int ww=min(L[xx]-L[yy],R[xx]+L[yy]);
  103. put(ww+dis[x]-dis[xx]+dis[y]-dis[yy]);continue;
  104. }
  105. put(dis[x]+dis[y]-dis[lca]*2);
  106. }
  107. return 0;
  108. }

bzoj 2125 最短路 点双 圆方树的更多相关文章

  1. UOJ#23. 【UR #1】跳蚤国王下江南 仙人掌 Tarjan 点双 圆方树 点分治 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ23.html 题目传送门 - UOJ#23 题意 给定一个有 n 个节点的仙人掌(可能有重边). 对于所有 ...

  2. 【BZOJ】2125: 最短路 圆方树(静态仙人掌)

    [题意]给定带边权仙人掌图,Q次询问两点间最短距离.n,m,Q<=10000 [算法]圆方树处理仙人掌问题 [题解]树上的两点间最短路问题,常用倍增求LCA解决,考虑扩展到仙人掌图. 先对仙人掌 ...

  3. BZOJ.2125.最短路(仙人掌 圆方树)

    题目链接 圆方树.做题思路不写了.. 就是当LCA是方点时跳进那个环可以分类讨论一下用树剖而不必须用倍增: 如果v是u的(唯一的那个)重儿子,那么u的DFS序上+1的点即是要找的:否则v会引出一条新的 ...

  4. BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树

    题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...

  5. 【BZOJ2125】最短路(仙人掌,圆方树)

    [BZOJ2125]最短路(仙人掌,圆方树) 题面 BZOJ 求仙人掌上两点间的最短路 题解 终于要构建圆方树啦 首先构建出圆方树,因为是仙人掌,和一般图可以稍微的不一样 直接\(tarjan\)缩点 ...

  6. 【刷题】BZOJ 2125 最短路

    Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个 ...

  7. BZOJ2125 最短路 圆方树、倍增

    传送门 对仙人掌建立圆方树,然后对边定权 对于圆点和圆点之间的边,是原来仙人掌上的桥,边权保持不变 对于圆点和方点之间的边,将圆方树看做以一个圆点为根的有根树之后,一个方点的父亲一定是一个圆点.对于这 ...

  8. BZOJ.2125.最短路(仙人掌 最短路Dijkstra)

    题目链接 多次询问求仙人掌上两点间的最短路径. 如果是在树上,那么求LCA就可以了. 先做着,看看能不能把它弄成树. 把仙人掌看作一个图(实际上就是),求一遍根节点到每个点的最短路dis[i]. 对于 ...

  9. 2018.07.25 bzoj2125: 最短路(圆方树+倍增)

    传送门 人生的第一道仙人掌. 这道题求是仙人掌上的最短路. 先建出圆方树,然后用倍增跑最短路,当lca" role="presentation" style=" ...

随机推荐

  1. DirectX11 With Windows SDK--32 SSAO(屏幕空间环境光遮蔽)

    前言 由于性能的限制,实时光照模型往往会忽略间接光因素(即场景中其他物体所反弹的光线).但在现实生活中,大部分光照其实是间接光.在第7章里面的光照方程里面引入了环境光项: \[C_a = \mathb ...

  2. Synchronized锁的是什么?

    Synchronized锁的是什么? 临界区与锁 并发编程中不可避免的会出现多个线程共享同一个资源的情况,为了防止出现数据不一致情况的发生,人们引入了临界区的概念.临界区是一个用来访问共享资源的代码块 ...

  3. PE文件结构详解(三)

    0x01 前言 上一篇讲到了数据目录表的结构和怎找到到数据目录表(DataDirectory[16]),这篇我们我来讲讲数据目录表后面的另一个结构——区块表. 0x01 区块 区块就是PE载入器将PE ...

  4. 干货分享丨jvm系列:dump文件深度分析

    摘要:java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因.那么dump文件的内容是什么样的呢? JVM ...

  5. day22 常用模块(上)

    一.时间模块 1 time模块 获取时间的三种格式: 第一种:time.time() 时间戳(timestamp):从1970年到现在的秒数 #应用场景:计算时间差 可以对时间加减,返回值为浮点型 p ...

  6. CSS 的层叠上下文是什么

    层叠上下文是 HTML 中的一个三维的概念,每个层叠上下文中都有一套元素的层叠排列顺序.页面根元素天生具有层叠上下文,所以整个页面处于一个“层叠结界”中. 层叠上下文的创建: 页面根元素:html z ...

  7. MISC学习记录 (一)

    A记录 题目 他在看什么视频,好像很好看,不知道是什么网站的. 还好我截取了他的数据包,找呀找. key就是网站名称.格式ctf{key} tip:A记录的第一条. 解题链接 过程 下载解题链接中的文 ...

  8. 前端03 /css简绍/css选择器

    前端03 /css简绍/css选择器 目录 前端03 /css简绍/css选择器 昨日内容回顾 html标签 常用标签 table标签:表格标签 input标签 select下拉框 textarea多 ...

  9. python处理json总结

    一.首先,了解下什么是JSON? JSON:JavaScript Object Notation [JavaScript 对象表示法] JSON 是一种轻量级的数据交换格式,完全独立于任何程序语言的文 ...

  10. 通过hmail搭建一个内网测试的邮件服务器

    ​    我们测试的软件基本上都是支持邮件功能,如果你的测试环境是在外网的话那还好说,可以直接使用QQ邮箱.163邮箱等.但是如果是测试环境在内网,无法直接访问到外网的时候,搭建一个邮件服务器就很有必 ...