hdu 2586 How far away ? 带权lca
How far away ?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
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.
3 2
1 2 10
3 1 15
1 2
2 3
2 2
1 2 100
1 2
2 1
25
100
100
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<string>
- #include<queue>
- #include<algorithm>
- #include<stack>
- #include<cstring>
- #include<vector>
- #include<list>
- #include<set>
- #include<map>
- #define true ture
- #define false flase
- using namespace std;
- #define ll long long
- #define inf 0xfffffff
- int scan()
- {
- int res = , ch ;
- while( !( ( ch = getchar() ) >= '' && ch <= '' ) )
- {
- if( ch == EOF ) return << ;
- }
- res = ch - '' ;
- while( ( ch = getchar() ) >= '' && ch <= '' )
- res = res * + ( ch - '' ) ;
- return res ;
- }
- #define maxn 40010
- #define M 22
- struct is
- {
- int v,next,w;
- } edge[maxn*];
- int deep[maxn],jiedge;
- int dis[maxn];
- int head[maxn];
- int rudu[maxn];
- int fa[maxn][M];
- void add(int u,int v,int w)
- {
- jiedge++;
- edge[jiedge].v=v;
- edge[jiedge].w=w;
- edge[jiedge].next=head[u];
- head[u]=jiedge;
- }
- void dfs(int u)
- {
- for(int i=head[u]; i; i=edge[i].next)
- {
- int v=edge[i].v;
- int w=edge[i].w;
- if(!deep[v])
- {
- dis[v]=dis[u]+edge[i].w;
- deep[v]=deep[u]+;
- fa[v][]=u;
- dfs(v);
- }
- }
- }
- void st(int n)
- {
- for(int j=; j<M; j++)
- for(int i=; i<=n; i++)
- fa[i][j]=fa[fa[i][j-]][j-];
- }
- int LCA(int u , int v)
- {
- if(deep[u] < deep[v]) swap(u , v) ;
- int d = deep[u] - deep[v] ;
- int i ;
- for(i = ; i < M ; i ++)
- {
- if( ( << i) & d ) // 注意此处,动手模拟一下,就会明白的
- {
- u = fa[u][i] ;
- }
- }
- if(u == v) return u ;
- for(i = M - ; i >= ; i --)
- {
- if(fa[u][i] != fa[v][i])
- {
- u = fa[u][i] ;
- v = fa[v][i] ;
- }
- }
- u = fa[u][] ;
- return u ;
- }
- void init()
- {
- memset(head,,sizeof(head));
- memset(fa,,sizeof(fa));
- memset(rudu,,sizeof(rudu));
- memset(deep,,sizeof(deep));
- jiedge=;
- }
- int main()
- {
- int x,n;
- int t;
- scanf("%d",&t);
- while(t--)
- {
- init();
- scanf("%d%d",&n,&x);
- for(int i=; i<n; i++)
- {
- int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- add(u,v,w);
- rudu[v]++;
- }
- for(int i=;i<=n;i++)
- {
- if(!rudu[i])
- {
- deep[i]=;
- dis[i]=;
- dfs(i);
- break;
- }
- }
- st(n);
- while(x--)
- {
- int a,b;
- scanf("%d%d",&a,&b);
- printf("%d\n",dis[a]-*dis[LCA(a,b)]+dis[b]);
- }
- }
- return ;
- }
hdu 2586 How far away ? 带权lca的更多相关文章
- hdu 2874 Connections between cities 带权lca判是否联通
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- hdu 2586 How far away ?倍增LCA
hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...
- HDU - 2586 How far away ?(LCA模板题)
HDU - 2586 How far away ? Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
- HDU 3047 Zjnu Stadium(带权并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...
- poj1986带权lca
lca求距离,带权值 的树上求lca,我是用倍增法求的,求两点之间的距离转化为到根节点之间的距离 (de了一个小时 的bug,重打居然就过了....) #include<map> #inc ...
- hdu 3074 Zjnu Stadium (带权并查集)
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 4359 Easy Tree DP? 带权二叉树的构造方法 dp
题意: 给定n deep 1.构造一个n个节点的带权树,且最大深度为deep,每一个节点最多仅仅能有2个儿子 2.每一个节点的值为2^0, 2^1 ··· 2^(n-1) 随意两个节点值不能同样 3 ...
- HDU 2586 How far away ?【LCA模板题】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给你N个点,M次询问.1~N-1行输入点与点之间的权值,之后M行输入两个点(a,b)之间的最 ...
随机推荐
- Scala中的数组和集合操作
package test /* 1.在scala集合中,Iterable是共同的Trait,Iterable要求继承者实现一些共同的方法,例如元素的遍历 * 2.Array是scala基础的数据结构, ...
- http协议基础(八)请求首部字段
请求首部字段 定义:请求首部字段是从客户端到服务器发送请求报文中所使用的字段,里面包含了附加信息.客户端信息以及对响应内容相关的优先级等内容 1.Accept 通知服务器用户代理可处理的媒体类型及媒体 ...
- 【剑指Offer学习】【面试题3 :二维数组中的查找】
package 二维数组查找; public class Test03 { /** * 在一个二维数组中,每一行都按 package 二维数组查找; public class Test03 { /** ...
- #C++初学记录(算法考试1)
B - Maximal Continuous Rest Each day in Berland consists of n hours. Polycarp likes time management. ...
- 用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台)
windows --> windows 写法均在py3.6 客户端写法 import socket client = socket.socket() client.connect(('192 ...
- 【codenet】代码相似度计算框架调研 -- 把内容与形式分开
首发于我的gitpages博客 https://helenawang.github.io/2018/10/10/代码相似度计算框架调研 代码相似度计算框架调研 研究现状 代码相似度计算是一个已有40年 ...
- linux常用命令:ps 命令
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- 蓝牙协议 HFP,HSP,A2DP,A2DP_CT,A2DP_TG,AVRCP,OPP,PBAP,SPP,FTP,TP,DTMF,DUN,SDP
简介: HSP(手机规格)– 提供手机(移动电话)与耳机之间通信所需的基本功能. HFP(免提规格)– 在 HSP 的基础上增加了某些扩展功能,原来只用于从固定车载免提装置来控制移动电话. A2DP( ...
- 访问Hsql .data数据库文件
一.Hsql简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议. 仅一个hsqldb.jar文件就包括了数据库引擎,数据库驱动,还有其他用户界面操作等内容.下载地址 ...
- 9大行为导致Java程序员薪资过低, 你有几个?
Java程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的Java程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?本文整理导致J ...