[poj1986]Distance Queries(LCA)
解题关键:LCA模板题
复杂度:$O(n\log n)$
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cstdlib>
- #include<cmath>
- #include<iostream>
- typedef long long ll;
- using namespace std;
- const int maxn=;
- const int maxm=;
- int _pow[maxm],m,n;
- int head[maxn],tot;
- int ver[maxn*],depth[maxn*],first[maxn],rmq[maxn*][maxm],id;//5个数组,注意哪个需要乘2
- ll dis[maxn];
- inline int read(){
- char k=;char ls;ls=getchar();for(;ls<''||ls>'';k=ls,ls=getchar());
- int x=;for(;ls>=''&&ls<='';ls=getchar())x=(x<<)+(x<<)+ls-'';
- if(k=='-')x=-x;return x;
- }
- struct edge{
- int to,w,nxt;
- }e[maxn*];//链式前向星建树
- void init(){
- memset(head,-,sizeof head);
- tot=;
- id=;
- }
- void add_edge(int u,int v,int w){
- e[tot].to=v;
- e[tot].w=w;
- e[tot].nxt=head[u];
- head[u]=tot++;
- }
- void dfs(int u,int fa,int dep){
- ver[++id]=u;//第i个访问到的结点编号
- depth[id]=dep;//第i个访问到的结点深度
- first[u]=id;
- for(int i=head[u];i!=-;i=e[i].nxt){
- int v=e[i].to;
- int w=e[i].w;
- if(v==fa) continue;
- dis[v]=dis[u]+w;//dis是先序遍历求
- dfs(v,u,dep+);
- ver[++id]=u;//后序遍历,再次访问父节点
- depth[id]=dep;
- }
- }
- void rmq_init(int n){
- int k=int(log(n)/log());
- for(int i=;i<=n;++i) rmq[i][]=i;
- for(int j=;j<=k;++j){
- for(int i=;i+_pow[j]-<=n;++i){//因为存的是索引
- int a=rmq[i][j-],b=rmq[i+_pow[j-]][j-];
- if(depth[a]<depth[b]) rmq[i][j]=a;
- else rmq[i][j]=b;
- }
- }
- }
- int rmq_query(int l,int r){
- int k=int(log(r-l+1.0)/log(2.0));
- int a=rmq[l][k],b=rmq[r-_pow[k]+][k];
- if(depth[a]<depth[b]) return a;
- else return b;
- }//返回的依然是索引
- int LCA(int u,int v){
- int x=first[u],y=first[v];
- if(x>y)swap(x,y);
- int res=rmq_query(x,y);
- return ver[res];
- }
- int main(){
- for(int i=;i<maxm;++i) _pow[i]=<<i; //预处理2^n
- int t,a,b,c;
- init();
- n=read(),m=read();
- for(int i=;i<m;++i){
- scanf("%d%d%d %*c",&a,&b,&c);
- add_edge(a,b,c);
- add_edge(b,a,c);
- }
- dfs(,-,);
- rmq_init(*n-);
- int m;
- m=read();
- for(int i=;i<m;++i){
- a=read();b=read();
- int ans=LCA(a,b);
- printf("%lld\n",dis[a]+dis[b]-*dis[ans]);
- }
- return ;
- }
[poj1986]Distance Queries(LCA)的更多相关文章
- poj-1986 Distance Queries(lca+ST+dfs)
题目链接: Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 11531 Accepted ...
- 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
题目链接: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模板题][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两点距离树
标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...
- poj1986 Distance Queries(lca又是一道模版题)
题目链接:http://poj.org/problem?id=1986 题意:就是老问题求val[u]+val[v]-2*val[root]就行.还有这题没有给出不联通怎么输出那么题目给出的数据一定 ...
- POJ 1986 Distance Queries(Tarjan离线法求LCA)
Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12846 Accepted: 4552 ...
随机推荐
- leetCode 90.Subsets II(子集II) 解题思路和方法
Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...
- ios导航栏问题
http://m.blog.csdn.net/article/details?id=47395605
- 扩容数据盘_Linux
扩容数据盘_Linux_扩容云盘_云盘_用户指南_云服务器 ECS-阿里云 https://help.aliyun.com/document_detail/25452.html 磁盘扩容付费后: 在控 ...
- 借助nodejs解析加密字符串 node安装库较python方便
const node_modules_path = '../node_modules/' // crypto-js - npm https://www.npmjs.com/package/crypto ...
- Leslie Lamport
http://lamport.azurewebsites.net/pubs/pubs.html paper
- 【题解】数字组合(NTT+组合 滑稽)
[题解]数字组合(NTT+组合 滑稽) 今天实践一下谢总讲的宰牛刀233,滑稽. \((1+x)(1+x)(1+x)\)的\(x^2\)系数就代表了有三个一快钱硬币构成的两块钱的方案数量. 很好理解, ...
- BZOJ2539: [Ctsc2000]丘比特的烦恼
BZOJ2539: [Ctsc2000]丘比特的烦恼 Description 随着社会的不断发展,人与人之间的感情越来越功利化. 最近,爱神丘比特发现,爱情也已不再是完全纯洁的了. 这使得丘比特很是苦 ...
- python3用pdfminer3k在线读取pdf文件
import importlib import sys import random from urllib.request import urlopen from urllib.request imp ...
- Swift 烧脑体操(四) - map 和 flatMap
前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...
- linux 下ftp的安装配置 图文教程
0.安装ftp的前置条件是关掉SElinux # vi /etc/selinux/config 修改 SELINUX=” disabled ” ,重启服务器.若相同,则跳过此步骤. 1. 可先查看是否 ...