poj1986 Distance Queries(lca又是一道模版题)
题目链接:http://poj.org/problem?id=1986
题意:就是老问题求val[u]+val[v]-2*val[root]就行。还有这题没有给出不联通怎么输出那么题目给出的数据一定
是联通的。
题解:就是单纯的lca。
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
const int M = 8e4 + 10;
vector<pair<int , int> >vc[M];
int p[M][20] , val[M] , deep[M];
void dfs(int pos , int pre , int d) {
p[pos][0] = pre;
deep[pos] = d;
int len = vc[pos].size();
for(int i = 0 ; i < len ; i++) {
int u = vc[pos][i].first;
if(u != pre) {
val[u] += val[pos] + vc[pos][i].second;
dfs(u , pos , d + 1);
}
}
}
void init(int n) {
for(int i = 0 ; i < 18 ; i++) {
for(int j = 1 ; j <= n ; j++) {
if(p[j][i] == -1) {
p[j][i + 1] = -1;
}
else {
p[j][i + 1] = p[p[j][i]][i];
}
}
}
}
int lca(int a , int b) {
if(deep[a] < deep[b]) {
swap(a , b);
}
int d = deep[a] - deep[b];
for(int i = 0 ; i < 18 ; i++) {
if(d & (1 << i)) {
a = p[a][i];
}
}
if(a == b) {
return a;
}
for(int i = 17 ; i >= 0 ; i--) {
if(p[a][i] != p[b][i] && p[a][i] != -1) {
a = p[a][i];
b = p[b][i];
}
}
return p[a][0];
}
int main() {
int n , m , u , v , w , k;
char cp[10];
while(scanf("%d%d" , &n , &m) != EOF) {
for(int i = 1 ; i <= n ; i++) {
val[i] = 0;
vc[i].clear();
}
for(int i = 1 ; i < n ; i++) {
scanf("%d%d%d%s" , &u , &v , &w , cp);
vc[u].push_back(make_pair(v , w));
vc[v].push_back(make_pair(u , w));
}
memset(p , -1 , sizeof(p));
dfs(1 , -1 , 1);
init(n);
scanf("%d" , &k);
while(k--) {
scanf("%d%d" , &u , &v);
printf("%d\n" , val[u] + val[v] - 2 * val[lca(u , v)]);
}
}
return 0;
}
poj1986 Distance Queries(lca又是一道模版题)的更多相关文章
- poj-1986 Distance Queries(lca+ST+dfs)
题目链接: Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 11531 Accepted ...
- [poj1986]Distance Queries(LCA)
解题关键:LCA模板题 复杂度:$O(n\log n)$ #pragma comment(linker, "/STACK:1024000000,1024000000") #incl ...
- POJ.1986 Distance Queries ( LCA 倍增 )
POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...
- POJ1986 Distance Queries (LCA)(倍增)
Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12950 Accepted: 4577 ...
- POJ 1986 - Distance Queries - [LCA模板题][Tarjan-LCA算法]
题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...
- poj 1986 Distance Queries LCA
题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...
- POJ 1986 Distance Queries(LCA Tarjan法)
Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...
- POJ 1986 Distance Queries LCA两点距离树
标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...
- 又是一道水题 hdu背包
Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负) ...
随机推荐
- 【POJ - 3258】River Hopscotch(二分)
River Hopscotch 直接中文 Descriptions 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一块岩石跳到另一块岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点 ...
- H3C软件开发笔试面试总结
注:我目前是陕西师范大学计算机科学学院本科生,在西安参加笔试以及面试 先是笔试,我选择的是JAVA方向,笔试选择题目主要是一些基础性的题目,然后简答题问了final.finally.finallize ...
- Cassandra之Docker环境实践
Cassandra简介 Cassandra是一个开源分布式NoSQL数据库系统. 它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon D ...
- xcode自动刷新resource下的文件
修改resource下的lua或者ccbi文件时,xcode并不会察觉到,所以需要手动清理xcode缓存和模拟器缓存,开发效率比较低下. 通过以下步骤可以实现自动刷新resource下的文件,且无需手 ...
- 【java提高】(17)---Java 位运算符
Java 位运算符 &.|.^.~.<<.>> 以前学过有关java的运算符,不过开发了这么久也很少用过这个.现在由于开发需要,所以现在再来回顾整理下有关java的运算 ...
- android 编译突然出错,错误原因 Could not resolve com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+.
错误追根是因为微信支付依赖的错误 解决办法: 微信支付依赖版本+号改为微信支付依赖最新版本 在这里https://bintray.com/wechat-sdk-team/maven可以查看到wecha ...
- java Timer工具类实现定时器任务
第一 schedule 方法 三个参数 按照顺序 (执行的任务方法,开始执行时间,多少时间后循环去执行) 代码可用 public class TestScheedule { public stati ...
- c# 读取 txt 文件中数据(int)
今天在学图的算法做测试是,需要读取文本文件中的点坐标,本来很简单的事情,折腾了半天,记录一下找到的一种简单粗暴的解决方法,以便以后查看. 第一种方法 : StringReader string lin ...
- ubuntu 开机进入grub rescue> 解决办法(nvme固态硬盘)
起因: 我是在windows下格式化了ubuntu的盘,然后重新安装ubuntu就出现了这种问题.卸载ubuntu的正确姿势,要去查一下,千万不要直接格式化. 解决方法: 1. 先使用ls命令,找到 ...
- Linux源码包安装apache(httpd)
我这里实验是用的CentOS7 #事先先检查一下自己的linux是否安装apache [root@localhost ~]#rpm –q httpd #如果已安装则先卸载原来的apache [root ...