还是LCA-tarjan算法,跟POJ 1330做法基本类似,只是这个题目要求输出两个点的最短距离,其实利用LCA的性质,就是 两个点分别到最近公共祖先的距离之和

一开始本来想用并查集把路径长度给找出来,但是不太好处理,原因是我刚好找到的这个点还没有加入到并查集中,(因为还没回溯上去),如果马上就合并,我还得把父亲传下来,还破坏了原有算法的结构(在孩子这里就进行了并查集合并操作),会产生奇怪的结果。。。

有个很简便又机智的方法,就是在dfs的过程中 一边记录从rt到下面的点的距离dis,假设 A 和 B 的LCA 是C,那么 我求的其实就是disA-disC+disB-disC,很机智吧

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N =80000+10;
int vis[N/2],f[N/2],dis[N/2],ans[N/2];
int v[N],w[N],nt[N],ft[N/2];
struct node
{
int v,id;
node(int _v,int _id)
{
v=_v;
id=_id;
}
};
vector<node> Q[N/2];
int out[211];
int n,m,tot;
void init()
{
tot=0;
for (int i=0;i<=n+1;i++){
ft[i]=-1;
Q[i].clear();
f[i]=i;
dis[i]=0;
vis[i]=0;
}
}
void add(int x,int y,int c)
{
v[tot]=y;
w[tot]=c;
nt[tot]=ft[x];
ft[x]=tot++;
}
int findset(int x)
{
if (x!=f[x]){
f[x]=findset(f[x]);
}
return f[x];
}
int unionset(int a,int b)
{
int r1,r2;
r1=findset(a);
r2=findset(b);
if (r1==r2) return r1;
f[r2]=r1;
return r1;
}
void LCA(int x,int pre)
{
ans[x]=x;
for (int i=ft[x];i!=-1;i=nt[i]){
int vx=v[i];
if (vx==pre) continue;
dis[vx]=dis[x]+w[i];
LCA(vx,x);
int rt=unionset(x,vx);
ans[rt]=x;
}
vis[x]=1;
for (int i=0;i<Q[x].size();i++){
node tmp=Q[x][i];
int vx=tmp.v;
if (vis[vx]){
out[tmp.id]=dis[x]+dis[vx]-2*dis[ans[findset(vx)]];
}
}
}
int main()
{
int t,a,b,c;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
init();
for (int i=1;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
for (int i=0;i<m;i++){
scanf("%d%d",&a,&b);
Q[a].push_back(node(b,i));
Q[b].push_back(node(a,i));
}
dis[1]=0; LCA(1,-1);
for (int i=0;i<m;i++){
printf("%d\n",out[i]);
}
}
return 0;
}

  

HDU 2586 LCA-Tarjan的更多相关文章

  1. HDU 2586 ( LCA/tarjan算法模板)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:n个村庄构成一棵无根树,q次询问,求任意两个村庄之间的最短距离 思路:求出两个村庄的LCA,d ...

  2. HDU 2586 (LCA模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 /   \ 2      3 ...

  3. [hdu 2586]lca模板题(在线+离线两种版本)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 在线版本: 在线方法的思路很简单,就是倍增.一遍dfs得到每个节点的父亲,以及每个点的深度.然后 ...

  4. HDU 2586 LCA

    题目大意: 多点形成一棵树,树上边有权值,给出一堆询问,求出每个询问中两个点的距离 这里求两个点的距离可以直接理解为求出两个点到根节点的权值之和,再减去2倍的最近公共祖先到根节点的距离 这是自己第一道 ...

  5. hdu 2586(Tarjan 离线算法)

    How far away ?                                                                             Time Limi ...

  6. hdu 2586(LCA在线ST)

    How far away ? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...

  7. hdu - 2586 (LCA板子题)

    传送门 (这次的英文题面要比上一个容易看多了) (英语蒟蒻的卑微) 又是一个很裸的LCA题 (显然,这次不太容易打暴力咧) (但听说还是有大佬用dfs直接a掉了) 正好 趁这个机会复习一下LCA 这里 ...

  8. hdu 2586 lca在线算法(朴素算法)

    #include<stdio.h> #include<string.h>//用c/c++会爆栈,用g++ac #define inf 0x3fffffff #define N ...

  9. LCA(最近公共祖先)--tarjan离线算法 hdu 2586

    HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  10. HDU - 2586 How far away ?(LCA模板题)

    HDU - 2586 How far away ? Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

随机推荐

  1. The Problem to Slow Down You

    The Problem to Slow Down You 输入:t个测试样例,每个样例输入两个字符串 输出:这两对字符串的回文串可以组成多少对本质不同的回文串 题意:给你两个字符串,然后问你这两字符串 ...

  2. Spark教程——(5)PySpark入门

    启动PySpark: [root@node1 ~]# pyspark Python 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 ...

  3. LeetCode 297.序列化二叉树 - JavaScript

    题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法 ...

  4. java Spring整合Freemarker的详细步骤

    java Spring整合Freemarker的详细步骤 作者: 字体:[增加 减小] 类型:转载 时间:2013-11-14我要评论 本文对Spring整合Freemarker步骤做了详细的说明,按 ...

  5. ubuntu18.04 LAMP DVWA

    一.基本擦作: sudo apt-get install lamp-server^ sudo chmod 777 /var/www #也有可能是/var/www/html,访问127.0.0.1验证是 ...

  6. delphi窗体按钮灰化禁用

    1.使最小化按钮变灰:setwindowlong(handle,gwl_style,getwindowlong(handle,gwl_style)   and   not   ws_minimizeb ...

  7. 项目实战报异常Exception及决绝方案

    1.报LifecycleException,再配置一下jdk即可,然后再手动添加maven 解决方法:  然后,手动添加jar包 2.maven 项目,右键maven build启动项目的时候,报下面 ...

  8. 8051单片机中访问int中字节的方法

    在使用单片机中,unsigned int 占2个字节,unsigned char 占一个字节.而单片机是实行的字节寻址.16字节的bit寻址实在是不好用, 不好用在不能建数组. 在实际的开发过程中,要 ...

  9. Nginx配置的一些说明(添加https证书)

    server { listen 443 ssl; #监听https 443端口 server_name www.XXXX.com; client_max_body_size 260M; #这下面的就是 ...

  10. Adobe Illustrator CC 2017安装方法

    1.下载软件地址 2017破解版32位64位中文版下载[百度网盘资源地址]:https://pan.baidu.com/s/13BsU8CfsLB6OXr7SkRFzCg 注意:使用之前请关闭杀毒软件 ...