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 ...
随机推荐
- apt-spy 软件源更新
ebian上的apt-get是最快的软件安装方式,不过要用好apt-get,首先得需要找到最快的源,这样安装软件的时候才能获得好的速度,用起来才能得心应手. 有的源在用了一段以后,就会失效,这个时候, ...
- 基于 CSP 的设计思想和 OOP 设计思想的异同
LinkerLin Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视.标准库的很多设计保留了很浓的OOP的味道.本篇Blog想比较下从设计的角度看,CSP和OO ...
- IE的BHO通过IHTMLDocument2接口获得网页源代码
参考了凤之焚的专栏:http://blog.csdn.net/lion_wing/article/details/769742 但是他的源码有些问题,即IHTMLElementCollection接口 ...
- 操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)
原文:操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP) 不管是用 PHP 还是 C#, 在操作 XML 的时候我们除了一个节点一个节点去取值之外, 还有一个非常方便的表达式, 就是 ...
- NET C#创建WINDOWS系统用户
原文:NET C#创建WINDOWS系统用户 /前提是当前用户有相应的权限 /WinNT用户管理 using System; using System.DirectoryServices; na ...
- Qt4.8.6详细安装步骤(使用了i686-4.8.2-release-posix-dwarf-rt_v3-rev3,手动设置gcc和gdb)非常清楚 good
摘要 在网上查看了很多篇关于Qt 4的安装方法,都是以前很久的帖子,所以就想按自己的方式重新总结一下,希望可以帮助到大家. Qt5的安装比较简单只需要下载一个文件qt-opensource-windo ...
- Git 常用命令大全(转)
Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone g ...
- Qt 之 样式表的使用——样式选择器(上下篇,很详细)
http://blog.csdn.net/goforwardtostep/article/details/60884870 http://blog.csdn.net/goforwardtostep/a ...
- 当程序调用dll时获取dll路径,DLL中获取自身的句柄
当程序调用dll时,获取dll路径的方法: HMODULE hMod = GetModuleHandle(_T("axload.dll")); if (hMod != NULL) ...
- Flume NG高可用集群搭建详解
.Flume NG简述 Flume NG是一个分布式,高可用,可靠的系统,它能将不同的海量数据收集,移动并存储到一个数据存储系统中.轻量,配置简单,适用于各种日志收集,并支持 Failover和负载均 ...