There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B"? Usually it hard to answer. But luckily int this village the answer is always unique, since the roads are built in the way that there is a unique simple path("simple" means you can't visit a place twice) between every two houses. Yout task is to answer all these curious people.

InputFirst line is a single integer T(T<=10), indicating the number of test cases.
  For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
  Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.OutputFor each test case,output m lines. Each line represents the answer of the query. Output a bland line after each test case.Sample Input

2
3 2
1 2 10
3 1 15
1 2
2 3 2 2
1 2 100
1 2
2 1

Sample Output

10
25
100
100

 1 #include<iostream>
2 #include<stdio.h>
3 #include<vector>
4 #include<algorithm>
5 #include<string.h>
6 using namespace std;
7 int ans[250],vis[40500];
8 vector< pair <int ,int > > vec[40500];
9 vector <pair <int ,int > > query[40500];
10 struct Node{
11 int f;
12 int len;
13 } pre[40500];
14 Node Find(int x)
15 {
16 if(pre[x].f==x)
17 {
18 return pre[x];
19 }
20 else
21 {
22 Node now;
23 now=Find(pre[x].f);
24 pre[x].len+=now.len;
25 pre[x].f=now.f;
26 return pre[x];
27 }
28 }
29 int dfs(int u,int fa,int length)
30 {
31 pre[u].f=u;
32 pre[u].len=0;
33 vis[u]=1;
34 for(int i=0;i<vec[u].size();i++)
35 {
36 int v=vec[u][i].first;
37 int len=vec[u][i].second;
38 if(v==fa) continue;
39 dfs(v,u,len);
40 }
41 for(int i=0;i<query[u].size();i++)
42 {
43 int v=query[u][i].first;
44 int id=query[u][i].second;
45 if(vis[v]==1)
46 {
47 ans[id]=Find(v).len+Find(u).len;
48 }
49 }
50 pre[u].f=fa;
51 pre[u].len+=length;
52 }
53 int main()
54 {
55 int T;
56 cin>>T;
57 while(T--)
58 {
59 int n,q,x,y,k;
60 cin>>n>>q;
61 for(int i=0;i<n-1;i++)
62 {
63 cin>>x>>y>>k;
64 vec[x].push_back({y,k});
65 vec[y].push_back({x,k});
66 vis[y]=1;
67 }
68 for(int i=0;i<q;i++)
69 {
70 cin>>x>>y;
71 query[x].push_back({y,i});
72 query[y].push_back({x,i});
73 }
74 for(int i=1;i<=n;i++)
75 {
76 if(vis[i]==0)
77 {
78 dfs(i,i,0);
79 break;
80 }
81 }
82 for(int i=0;i<q;i++)
83 cout<<ans[i]<<endl;
84 for(int i=0;i<=n;i++)
85 {
86 vec[i].clear();
87 query[i].clear();
88 }
89 memset(pre,0,sizeof(pre));
90 memset(vis,0,sizeof(vis));
91 }
92 return 0;
93 }



												

HDU-2586 How far away?的更多相关文章

  1. HDU - 2586 How far away ?(LCA模板题)

    HDU - 2586 How far away ? Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  2. hdu 2586 How far away ?倍增LCA

    hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...

  3. HDU 2586 How far away ?【LCA】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Oth ...

  4. HDU 2586.How far away ?-离线LCA(Tarjan)

    2586.How far away ? 这个题以前写过在线LCA(ST)的,HDU2586.How far away ?-在线LCA(ST) 现在贴一个离线Tarjan版的 代码: //A-HDU25 ...

  5. HDU 2586 How far away ? (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...

  6. hdu - 2586 How far away ?(最短路共同祖先问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 最近公共祖先问题~~LAC离散算法 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起 ...

  7. HDU 2586 How far away ?(LCA在线算法实现)

    http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵树,求出树上任意两点之间的距离. 思路: 这道题可以利用LCA来做,记录好每个点距离根结点的 ...

  8. HDU 2586 How far away ?(LCA模板 近期公共祖先啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 Problem Description There are n houses in the vi ...

  9. HDU 2586 How far away ?【LCA模板题】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给你N个点,M次询问.1~N-1行输入点与点之间的权值,之后M行输入两个点(a,b)之间的最 ...

  10. hdu 2586 How far away ?(LCA - Tarjan算法 离线 模板题)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. 《小白WEB安全入门》01. 扫盲篇

    @ 目录 基础知识 什么是WEB 什么是前端 什么是后端 什么是数据库 什么是协议 什么是WEB安全 什么是服务器 什么是IP地址.端口 什么是局域网.广域网.内网.外网 什么是URL 什么是MAC地 ...

  2. CodeForces 1367E Necklace Assembly

    题意 给定一个字符串\(s\),长度为\(n\),一根项链为一个环,定义一根项链为\(k-beautiful\),则该项链顺时针转\(k\)下后与原项链相等,给出\(k\),请构造一根最长的\(k-b ...

  3. Nomad 系列-快速上手

    系列文章 Nomad 系列文章 Nomad 重要术语 Nomad 安装设置相关术语 agent - 代理.Agent 是在 Server(服务器) 或 Client(客户端) 模式下运行的 Nomad ...

  4. 我的新书《Flink大数据分析实战》出版啦

  5. Python colorama 设置控制台、命令行输出彩色文字

    为了方便调试代码,经常会向stdout中输出一些日志,但是大量日志,有时不好定位问题. 使用终端打印特定颜色字符串,可以突出显示关键性的信息,帮助用户更好地识别和理解输出内容. https://pyp ...

  6. 用 Rust 的 declarative macro 做了个小东西

    最近几天在弄 ddnspod 的时候,写了个宏: custom_meta_struct 解决什么问题 #[derive(Debug, Clone, serde::Serialize, serde::D ...

  7. Unity 游戏开发、03 基础篇 | C#初级编程

    C#初级编程 https://learn.u3d.cn/tutorial/beginner-gameplay-scripting 8 Update 和 FixedUpdate Update(不是按固定 ...

  8. Vue源码学习(八):生命周期调用

    好家伙,   Vue源码学习(七):合并生命周期(混入Vue.Mixin) 书接上回,在上一篇中,我们已经实现了合并生命周期 现在,我们要在我们的初始化过程中,注册生命周期 1.项目目录  红框为本篇 ...

  9. android开发阶段性技能

    一.初级 1. 拥有娴熟的Java基础,理解设计模式,比如OOP语言的工厂模式要懂得. 2. 掌握Android UI控件.Android Java层API相关使用. 迈向中级,最好再次更新下Java ...

  10. Chromium 通过IDL方式添加扩展API

    基于chromium103版本 1. 自定义扩展API接口 chromium默认扩展api接口中有chrome.runtime.*,和chrome.send.*等,现在我们就仿照chrome.runt ...