【题意】给你N个点,N条不同的边,Q次询问,求出u,v之间的最短路。

【分析】题意很简单,就是求最短路,但是Q次啊,暴力DIJ?当然不行,观察到这个题边的数目和点的数目是相同的,也就是说这个图是由一棵树加了一条边而形成的。而对于一棵树,如果有Q次询问最短路,那就可以用LCA来做,复杂度QlogN,但是现在加了一条边,可能会使有些点之间的路径变短。假设多加的这条边的两个端点是U,V,那么对于询问的X,Y,有这么三种情况,直接过LCA,或者经过U,V,详情见代码。

  1. #include <bits/stdc++.h>
  2. #define met(a,b) memset(a,b,sizeof a)
  3. #define pb push_back
  4. #define mp make_pair
  5. #define lson l,m,rt<<1
  6. #define rson m+1,r,rt<<1|1
  7. #define lowbit(x) (x&(-x))
  8. using namespace std;
  9. typedef long long ll;
  10. ll mod = 1e9+;
  11. const int N=3e4+;
  12. const int M=N*N+;
  13. int n,m,k,root,son,dis[N],dep[N],fa[N][],parent[N];
  14. int d;
  15. vector<pair<int,int> >edg[N];
  16. int Find(int x){
  17. if(parent[x]!=x)parent[x]=Find(parent[x]);
  18. return parent[x];
  19. }
  20. void Union(int x,int y){
  21. x=Find(x);
  22. y=Find(y);
  23. if(x==y)return;
  24. parent[y]=x;
  25. }
  26. void dfs(int u,int f){
  27. fa[u][]=f;
  28. for(int i=; i<; i++){
  29. fa[u][i]=fa[fa[u][i-]][i-];
  30. }
  31. for(int i=; i<edg[u].size(); i++){
  32. int v=edg[u][i].first;
  33. if(v==f)continue;
  34. dis[v]=dis[u]+edg[u][i].second;
  35. dep[v]=dep[u]+;
  36. dfs(v,u);
  37. }
  38. }
  39. int Lca(int u,int v){
  40. int U=u,V=v;
  41. if(dep[u]<dep[v])swap(u,v);
  42. for(int i=; i>=; i--){
  43. if(dep[fa[u][i]]>=dep[v]){
  44. u=fa[u][i];
  45. }
  46. }
  47. if(u==v)return u;
  48. for(int i=; i>=; i--){
  49. if(fa[u][i]!=fa[v][i]){
  50. u=fa[u][i];
  51. v=fa[v][i];
  52. }
  53. }
  54. return fa[u][];
  55. }
  56. int main(){
  57. int u,v,w;
  58. int T;
  59. scanf("%d",&T);
  60. while(T--){
  61. for(int i=; i<N; i++)dis[i]=dep[i]=,edg[i].clear(),parent[i]=i;
  62. met(fa,-);
  63. scanf("%d%d",&n,&m);
  64. for(int i=; i<=n; i++){
  65. scanf("%d%d%d",&u,&v,&w);
  66. u++;v++;
  67. if(Find(u)==Find(v))root=u,son=v,d=w;
  68. else{
  69. Union(u,v);
  70. edg[u].pb(mp(v,w));
  71. edg[v].pb(mp(u,w));
  72. }
  73. }
  74. dep[root]=;
  75. dfs(root,-);
  76. while(m--){
  77. scanf("%d%d",&u,&v);
  78. u++;v++;
  79. int lca=Lca(u,v);
  80. int ans1=dis[u]+dis[v]-*dis[lca];
  81. int ans2=dis[u]+dis[son]-*dis[Lca(u,son)]+dis[v]+dis[root]-*dis[Lca(root,v)]+d;
  82. int ans3=dis[v]+dis[son]-*dis[Lca(v,son)]+dis[u]+dis[root]-*dis[Lca(root,u)]+d;
  83. printf("%d\n",min(ans1,min(ans2,ans3)));
  84. }
  85. }
  86. return ;
  87. }

北方大学 ACM 多校训练赛 第七场 C Castle(LCA)的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...

  2. HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...

  3. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  4. 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...

  5. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  6. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  7. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  8. 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

  9. 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...

随机推荐

  1. 从无到有搭建SSM框架

    框架   https://www.cnblogs.com/xiaoL/p/7753130.html log4j配置详解    https://www.cnblogs.com/SummerinShire ...

  2. js获取摄像头视频流

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 【洛谷 P3165】 [CQOI2014]排序机械臂 (Splay)

    题目链接 debug了\(N\)天没debug出来,原来是找后继的时候没有pushdown... 众所周知,,Splay中每个编号对应的节点的值是永远不会变的,因为所有旋转.翻转操作改变的都是父节点和 ...

  4. Farey Sequence (欧拉函数+前缀和)

    题目链接:http://poj.org/problem?id=2478 Description The Farey Sequence Fn for any integer n with n >= ...

  5. POJ 30253 Fence Repair (二叉树+优先队列)

    题目链接 Description Farmer John wants to repair a small length of the fence around the pasture. He meas ...

  6. css纯样式导航

    <style>.dropdown {    position: relative;    display: inline-block;} .dropdown-content {    di ...

  7. bzoj 1197 DP

    我们可以将这个问题转化为在n维空间中一共放m个n维球,求这m个球最多将这个空间分为不同的几个部分. 那么我们设w[i][j]代表i为空间放j个球分为的部分,那么w[i][j]=w[i][j-1]+w[ ...

  8. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  9. Angular2.0 基础: Form

    对于Angular2.0 的Form表单中的隐藏和验证,个人觉得还是挺有意思的. 1.通过ngModel 跟踪修改状态与验证. 在表单中使用 ngModel 可以获得更多的控制权,包括一些常用的验证. ...

  10. Python3 Socket和SocketServer 网络编程

    socket只能实现同时一个服务和一个客户端实现交互,socketserver可以实现多个客户端同时和服务端交互 1.利用Socket编写简单的同一个端口容许多次会话的小案例: 服务端: #!/usr ...