POJ 1986:Distance Queries(倍增求LCA)
http://poj.org/problem?id=1986
题意:给出一棵n个点m条边的树,还有q个询问,求树上两点的距离。
思路:这次学了一下倍增算法求LCA。模板。
dp[i][j]代表第i个点的第2^j个祖先是哪个点,dp[i][0] = i的第一个祖先 = fa[i]。转移方程:dp[i][j] = dp[dp[i][j-1][j-1]。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define N 100010
struct Edge {
int v, nxt, w;
Edge () {}
Edge (int v, int nxt, int w) : v(v), nxt(nxt), w(w) {}
} edge[N];
int dp[N][], dep[N], dis[N], fa[N], head[N], tot, n; void Add(int u, int v, int w) {
edge[tot] = Edge(v, head[u], w); head[u] = tot++;
edge[tot] = Edge(u, head[v], w); head[v] = tot++;
} void DFS(int u) {
dp[u][] = fa[u];
for(int i = ; i <= ; i++) // 转移
dp[u][i] = dp[dp[u][i-]][i-];
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].v;
if(v == fa[u]) continue;
fa[v] = u;
dep[v] = dep[u] + ;
dis[v] = dis[u] + edge[i].w;
DFS(v);
}
} int LCA(int x, int y) {
if(dep[x] < dep[y]) swap(x, y); //设x为较深的点
for(int i = ; i >= ; i--) // 让x跑到和y同一深度
if(dep[dp[x][i]] >= dep[y]) x = dp[x][i];
if(x == y) return x;
for(int i = ; i >= ; i--) // x和y同时向上跑
if(dp[x][i] != dp[y][i])
x = dp[x][i], y = dp[y][i];
return dp[x][];
} int main() {
int m, q;
while(~scanf("%d%d", &n, &m)) {
memset(dp, , sizeof(dp));
memset(dis, , sizeof(dis));
memset(dep, , sizeof(dep));
memset(head, -, sizeof(head));
tot = ; char s[];
for(int i = ; i < m; i++) {
int u, v, w;
scanf("%d%d%d%s", &u, &v, &w, s);
Add(u, v, w);
}
fa[] = ; dis[] = dep[] = ;
DFS();
scanf("%d", &q);
while(q--) {
int u, v;
scanf("%d%d", &u, &v);
printf("%d\n", dis[u] + dis[v] - dis[LCA(u, v)] * );
}
}
return ;
}
POJ 1986:Distance Queries(倍增求LCA)的更多相关文章
- poj 1986 Distance Queries 带权lca 模版题
Distance Queries Description Farmer John's cows refused to run in his marathon since he chose a pa ...
- POJ.1986 Distance Queries ( LCA 倍增 )
POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...
- POJ 1986 Distance Queries LCA两点距离树
标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】
任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total ...
- POJ 1986 Distance Queries(Tarjan离线法求LCA)
Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12846 Accepted: 4552 ...
- 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-LCA算法]
题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...
- POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)
题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...
- poj 1986 Distance Queries(LCA)
Description Farmer John's cows refused to run in his marathon since he chose a path much too long fo ...
随机推荐
- 仿真算法数据结构与算法 C++实现
模拟算法:仿真的全过程,通过改变数学模型参数,进一步观察状态更改这些参数发生变化正当程序. 算法思路:利用随机函数来模拟不可预测发生在自然界.(srand() 和 rand()函数生成一个随机数) 模 ...
- MySql 5.7 重置root密码
一.以安全模式登录 # Stop MySQL sudo service mysql stop # Make MySQL service directory. sudo mkdir -p /var/ru ...
- DataSet 互相转换 List
/// <summary> /// List <-> DataSet /// </summary> public class IListDataSet { /// ...
- 基于树莓派的微型气象站设计与开发(Windows 10 IoT Core)
前言 树莓派(Raspberry Pi,RPi)是专门为学生计算机编程教育而设计,只有信用卡大小的卡片式电脑,可以运行Linux或者Windows 10 IoT Core操作系统.本文将利用树莓派和U ...
- pdf密码解除工具
PDF Password Remover 3.0下载地址: 链接:https://pan.baidu.com/s/1hAmcGB-vMxz79IGGskdzHQ 提取码:q6y8
- .Net Core中使用NodeJs加解密DES,MD5,AES,REA
鉴于使用.net core我们的加解密也同时迁移到了跨平台上,我使用的是NodeJs加解密的.废话不多说了,还是来干活吧. 1.创建Node项目 2.添加package.json { "n ...
- NPOI 替换word模版
private void Button_Click(object sender, RoutedEventArgs e) { string fileName = @"C:\Users\Admi ...
- SQL SERVER中UPDLOCK ,READPAST使用
原文:SQL SERVER中UPDLOCK ,READPAST使用 SQL SERVER中中获取不重复数据: select top 1 * from orders with(UPDLOCK ,READ ...
- 浅谈Linux(Centos7.4)环境下NTP服务器的构建
一.软件环境 1.操作系统版本 [root@Geeklp201 etc]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core ...
- python连接数据库(2)——mongodb
mongodb是近一段时间以来比较流行的非关系数据库之一,由于python和它都对json类型有着很好的支持,因此配合起来可谓天衣无缝. 首先要下载python对mongodb支持的包pymongo ...