1. #include <iostream>
  2. #include <cstdio>
  3. #include <sstream>
  4. #include <cstring>
  5. #include <map>
  6. #include <set>
  7. #include <vector>
  8. #include <stack>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <cmath>
  12. #define rap(i, a, n) for(int i=a; i<=n; i++)
  13. #define MOD 2018
  14. #define LL long long
  15. #define ULL unsigned long long
  16. #define Pair pair<int, int>
  17. #define mem(a, b) memset(a, b, sizeof(a))
  18. #define _ ios_base::sync_with_stdio(0),cin.tie(0)
  19. //freopen("1.txt", "r", stdin);
  20. using namespace std;
  21. const int maxn = * 1e5 + , INF = 0x7fffffff;
  22. LL n, m, cnt1, cnt2, c;
  23. LL head1[maxn], head2[maxn], f[maxn], vis[maxn], bz[maxn];
  24. LL dis[][maxn], d[maxn];
  25. LL res[maxn];
  26. vector<LL> se;
  27. struct node
  28. {
  29. LL u, v, w, next;
  30. }Node[maxn];
  31.  
  32. struct edge
  33. {
  34. LL u, v, id, next;
  35. }Edge[maxn];
  36.  
  37. void add1_(LL u, LL v, LL w)
  38. {
  39. Node[cnt1].u = u;
  40. Node[cnt1].v = v;
  41. Node[cnt1].w = w;
  42. Node[cnt1].next = head1[u];
  43. head1[u] = cnt1++;
  44. }
  45.  
  46. void add1(LL u, LL v, LL w)
  47. {
  48. add1_(u, v, w);
  49. add1_(v, u, w);
  50. }
  51.  
  52. void add2_(LL u, LL v, LL id)
  53. {
  54. Edge[cnt2].u = u;
  55. Edge[cnt2].v = v;
  56. Edge[cnt2].id = id;
  57. Edge[cnt2].next = head2[u];
  58. head2[u] = cnt2++;
  59. }
  60.  
  61. void add2(LL u, LL v, LL id)
  62. {
  63. add2_(u, v, id);
  64. add2_(v, u, id);
  65. }
  66.  
  67. LL find(LL x)
  68. {
  69. return f[x]==x?x:(f[x] = find(f[x]));
  70. }
  71.  
  72. LL lca(LL u, LL deep, LL root)
  73. {
  74. f[u] = u;
  75. d[u] = deep;
  76. vis[u] = root; // 标记属于的树
  77. for(LL i=head1[u]; i!=-; i=Node[i].next)
  78. {
  79. node e = Node[i];
  80. if(vis[e.v] == -)
  81. {
  82. bz[i/] = ;
  83. lca(e.v, deep+e.w, root);
  84. f[e.v] = u;
  85. }
  86. }
  87. for(LL i=head2[u]; i!=-; i=Edge[i].next)
  88. {
  89. edge e = Edge[i];
  90. if(vis[e.v] == root) //判断另一个结点是不是和u属于一个树
  91. {
  92. LL k = find(e.v); //寻找最近公共祖先
  93. res[e.id] = d[u] + d[e.v] - *d[k];
  94. }
  95. }
  96. }
  97.  
  98. void spfa(LL s, LL id)
  99. {
  100. for(LL i=; i<=n; i++) dis[id][i] = INF;
  101. mem(vis, );
  102. queue<LL> Q;
  103. Q.push(s);
  104. vis[s] = ;
  105. dis[id][s] = ;
  106. while(!Q.empty())
  107. {
  108. LL u = Q.front(); Q.pop();
  109. vis[u] = ;
  110. for(LL i=head1[u]; i!=-; i=Node[i].next)
  111. {
  112. node e = Node[i];
  113. if(dis[id][e.v] > dis[id][u] + e.w)
  114. {
  115. dis[id][e.v] = dis[id][u] + e.w;
  116. if(!vis[e.v])
  117. {
  118. Q.push(e.v);
  119. vis[e.v] = ;
  120. }
  121. }
  122. }
  123. }
  124. }
  125.  
  126. void init()
  127. {
  128. mem(head1, -);
  129. mem(head2, -);
  130. mem(res, -);
  131. mem(vis, -);
  132. cnt1 = cnt2 = ;
  133. }
  134.  
  135. int main()
  136. {
  137. cin >> n >> m;
  138. init();
  139. rap(i, , m)
  140. {
  141. LL u, v, w;
  142. scanf("%lld%lld%lld", &u, &v, &w);
  143. add1(u, v, w);
  144. }
  145. cin >> c;
  146. for(LL i=; i<=c; i++)
  147. {
  148. LL u, v;
  149. scanf("%lld%lld", &u, &v);
  150. add2(u, v, i);
  151. }
  152. for(LL i=; i<=n; i++)
  153. if(vis[i] == -)
  154. lca(i, , i);
  155. mem(vis, -);
  156. for(LL i=; i<cnt1; i++)
  157. {
  158. if(!bz[i/])
  159. {
  160. if(vis[Node[i].u] == -) se.push_back(Node[i].u), vis[Node[i].u] = ;
  161. if(vis[Node[i].v] == -) se.push_back(Node[i].v), vis[Node[i].v] = ;
  162. }
  163. }
  164. for(LL i=; i<se.size(); i++)
  165. {
  166. // cout << se[i] << endl;
  167. spfa(se[i], i);
  168.  
  169. }
  170.  
  171. for(LL i=; i<=c; i++)
  172. {
  173. for(LL j=; j<se.size(); j++)
  174. res[i] = min(res[i], dis[j][Edge[i*-].u] + dis[j][Edge[i*-].v]);
  175. printf("%lld\n", res[i]);
  176. }
  177.  
  178. return ;
  179. }

The Shortest Statement

CodeForces - 1051F

The Shortest Statement CodeForces - 1051F(待测试)的更多相关文章

  1. The Shortest Statement CodeForces - 1051F 最小生成树+并查集+LCA

    题目描述 You are given a weighed undirected connected graph, consisting of n vertices and mm edges. You ...

  2. codeforces 1051F The Shortest Statement

    题目链接:codeforces 1051F The Shortest Statement 题意:\(q\)组询问,求任意两点之间的最短路,图满足\(m-n\leq 20\) 分析:一开始看这道题:fl ...

  3. Codeforces 1051E Vasya and Big Integers&1051F The Shortest Statement

    1051E. Vasya and Big Integers 题意 给出三个大整数\(a,l,r\),定义\(a\)的一种合法的拆分为把\(a\)表示成若干个字符串首位相连,且每个字符串的大小在\(l, ...

  4. Educational Codeforces Round 51 (Rated for Div. 2) F - The Shortest Statement 倍增LCA + 最短路

    F - The Shortest Statement emmm, 比赛的时候没有想到如何利用非树边. 其实感觉很简单.. 对于一个询问答案分为两部分求: 第一部分:只经过树边,用倍增就能求出来啦. 第 ...

  5. Educational Codeforces Round 51 (Rated for Div. 2) The Shortest Statement

    题目链接:The Shortest Statement 今天又在群里看到一个同学问$n$个$n$条边,怎么查询两点直接最短路.看来这种题还挺常见的. 为什么最终答案要从42个点的最短路(到$x,y$) ...

  6. CF 1051 F. The Shortest Statement

    F. The Shortest Statement http://codeforces.com/contest/1051/problem/F 题意: n个点,m条边的无向图,每次询问两点之间的最短路. ...

  7. 【题解】Luogu CF1051F The Shortest Statement

    原题传送门:CF1051F The Shortest Statement 题目大意,给你一个稀疏图,q次查询,查询两点之间距离 边数减点小于等于20 这不是弱智题吗,23forever dalao又开 ...

  8. CF_Edu.#51_Div.2_1051F_The Shortest Statement

    F. The Shortest Statement time limit per test:4 seconds memory limit per test:256 megabytes input:st ...

  9. [Codeforces 1051F] The Shortest Statement 解题报告(树+最短路)

    题目链接: https://codeforces.com/contest/1051/problem/F 题目大意: 给出一张$n$个点,$m$条边的带权无向图,多次询问,每次给出$u,v$,要求输出$ ...

随机推荐

  1. DataWorks使用小结(一)——概述

    一.概述 DataWorks数据工场,是MaxComputer的可视化开发平台,一站式开发.管理界面 1.功能概述 1.强大调度:支持分钟到月的调度 2.多种任务:支持ODPS.SHELL等多种任务 ...

  2. SequenceFile文件

    SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).目前,也有不少人在该文件的基础之上提出了一些HDFS中小文件存储的解决方案 ...

  3. 关于用tesseract和tesserocr识别图片的一个问题

    对于像我这样初学python网络爬虫的freshman来说,软件的准备和环境的配置能让我们崩溃.其中用刚安装好的tesseract和tesserocr库测试识别验证码就是其中一例. 这里我要测试的验证 ...

  4. 分布式监控系统Zabbix-批量添加聚合图形

    之前部署了Zabbix(3.4.4版本)监控环境,由于主机比较多,分的主机组也比较多,添加聚合图形比较麻烦,故采用python脚本进行批量添加聚合图形.脚本下载地址:https://pan.baidu ...

  5. Tomcat利用MSM实现Session共享方案解说

    Session共享有多种解决方法,常用的有四种:1)客户端Cookie保存2)服务器间Session同步3)使用集群管理Session(如MSM) 4)把Session持久化到数据库 针对上面Sess ...

  6. linux下expect环境安装以及简单脚本测试

    expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...

  7. Ansible之playbook的使用总结 - 运维笔记

    之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装 ...

  8. Python-复习-文件操作-21

    # 文件处理 # 打开文件 #open('路径','打开方式','指定编码方式') # 打开方式 r w a r+ w+ a+ b #r+ 打开文件直接写 和读完再写 # 编码方式 —— utf-8 ...

  9. 《linux内核设计与实现》读书笔记——第三章

  10. T-shirt 0 0....

    老师给我这件T-shirt的目的是为了让我减肥吗...... 听说了pbb的事迹好感动 //偷偷吐槽一句,那个全套吉米多维奇可以报销吗...我就看了2行........ 吓得我赶紧看了一下浴盆的气球