http://acm.hdu.edu.cn/showproblem.php?pid=2586

题意:有n个点,有n-1条线连通,求两点间的最短距离,最近公共祖先的入门题。Tarjan离线算法。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int t;
int n,m;
int x,y,z;
bool vis[];///深搜过程判断是否被搜过
int par[];///存储节点的父亲
int dis[];///任意一点到搜索起始点的距离
int ans[]; struct node1
{
int to;
int val;
};
vector<node1>edge[];///邻接表存储边 struct node2
{
int to;
int idx;///第几个查询
};
vector<node2>que[];///邻接表存储查询 void init()
{
memset(dis,,sizeof(dis));
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++)
{
edge[i].clear();
que[i].clear();
par[i]=i;
}
} int find(int x)///并查集找爹
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
} void unit(int x,int y)///认x做父亲
{
x=find(x);
y=find(y);
if(x!=y)
par[y]=x;
} void dfs(int now,int w)///now是当前点,w是到起始点的距离
{
vis[now]=true;
dis[now]=w;
int len1=edge[now].size();
for(int i=;i<len1;i++)
{
int temp=edge[now][i].to;///临时存储邻接点,简洁表示
if( !vis[ temp ] )
{
dfs( temp,w+edge[now][i].val );
unit(now,temp);///搜完才更新父节点
}
} int len2=que[now].size();
for(int i=;i<len2;i++)///看一下有没有 与 当前点 有询问关系的点
{
int temp=que[now][i].to;
if( vis[ temp ] )
{
ans[ que[now][i].idx ] = dis[now]+dis[temp]-*dis[ find(temp) ];
///两点的最短距离 = 两点到起点的距离之和 - 两倍公共祖先到起点的距离
}
}
} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
init();
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
edge[x].push_back( {y,z} );
edge[y].push_back( {x,z} );
}
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
que[x].push_back( {y,i} );
que[y].push_back( {x,i} );
}
dfs(,);///以1为起始点深搜
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
}
return ;
}

hdu2586How far away ?-(LCA)的更多相关文章

  1. HDU2586---How far away ?(lca算法)

    Problem Description There are n houses in the village and some bidirectional roads connecting them. ...

  2. How far away ?(LCA)dfs和倍增模版

    How far away ? Tarjan http://www.cnblogs.com/caiyishuai/p/8572859.html Time Limit: 2000/1000 MS (Jav ...

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

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

  4. 「LuoguP3379」 【模板】最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  5. 最近公共祖先(LCA)---tarjan算法

    LCA(最近公共祖先).....可惜我只会用tarjan去做 真心感觉tarjan算法要比倍增算法要好理解的多,可能是我脑子笨吧略略略 最近公共祖先概念:在一棵无环的树上寻找两个点在这棵树上深度最大的 ...

  6. 最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解

    研究了LCA,写篇笔记记录一下. 讲解使用例题 P3379 [模板]最近公共祖先(LCA). 什么是LCA 最近公共祖先简称 LCA(Lowest Common Ancestor).两个节点的最近公共 ...

  7. Repository 仓储,你的归宿究竟在哪?(三)-SELECT 某某某。。。

    写在前面 首先,本篇博文主要包含两个主题: 领域服务中使用仓储 SELECT 某某某(有点晕?请看下面.) 上一篇:Repository 仓储,你的归宿究竟在哪?(二)-这样的应用层代码,你能接受吗? ...

  8. 【转载】在 2016 年做 PHP 开发是一种什么样的体验?(一)

    转自:https://www.v2ex.com/t/312651 在 2016 年做 PHP 开发是一种什么样的体验?(一) 嘿,我最近接到一个网站开发的项目,不过老实说,我这两年没怎么接触编程,听说 ...

  9. Repository 仓储,你的归宿究竟在哪?(二)-这样的应用层代码,你能接受吗?

    写在前面 关于"Repository 仓储,你的归宿究竟在哪?"这个系列,本来是想写个上下篇,但是现在觉得,很有多东西需要明确,我也不知道接下来会写多少篇,所以上一篇的标题就改成了 ...

随机推荐

  1. Eclipse从GitHub下载代码

    转载自:http://blog.csdn.net/u014785687/article/details/73473769 打开git视图(window->show view),搜索git,选择G ...

  2. HD,3G视频数据中行号的插入方法---Verilog代码实现

    HD,3G视频数据中行号的插入方法---Verilog代码实现 行号的生成: `timescale 1ns / 1ps //////////////////////////////////////// ...

  3. 【Oracle】ORA-14400: 插入的分区关键字未映射到任何分区

    问题描述: 工作中使用kettle将原始库中的数据抽取到标准库中,在抽取过程中报错:[ORA-14400: 插入的分区关键字未映射到任何分区]/[ORA-14400: inserted partiti ...

  4. css3动画的简单学习

    transform常用的属性(2D变化): translate(x,y) 定义 2D 转换. scale(x,y) 定义 2D 缩放转换 rotate(angle) 定义 2D 旋转,在参数中规定角度 ...

  5. 3DAY 用户管理

    0xff001用户/组管理 1.描述 用户和组: 系统上的每一个进程(运行程序)都是作为一个特定的用户运行的 每个文件都由特定的用户拥有 对文件和目录的访问受到用户的限制 与正在运行的进程相关联的用户 ...

  6. 01 jmeter性能测试系列_Jmeter的体系结构

    深圳文鹏教育jmeter 性能测试讲义 概念 元件:元件代表jmeter工具菜单中的一个子菜单,比如HTTP请求.事务控制器.响应断言等: 组件:一组元件的集合(一个或者多个),比如逻辑控制器中有事务 ...

  7. 棒槌的工作第11天-----------------------单词(select和epoll)

    https://baike.baidu.com/item/epoll/10738144?fr=aladdin epoll百科 https://baike.baidu.com/item/select%2 ...

  8. Java Base64位加密和解密(包括其他加密参考)

    链接https://blog.csdn.net/longguangfu8/article/details/78948213 常用加密解密算法[RSA.AES.DES.MD5]介绍和使用 https:/ ...

  9. vs 为什么使用#include "stdafx.h"

    原因:1.减少编译次数 2.减少不必要的处理 流程图: 这个跟宏定义#ifndef xx #define xx  coding here #endif //xx 区别在于: 宏定义是防止头文件重复包含 ...

  10. Celery异步的分布式任务调度理解

    什么是Celery呢? Celery是一个用Python开发的异步的分布式任务调度模块. Celery本身不包含消息服务,使用第三方消息服务,也就是Broker,来传递任务,目前支持的有Rebbimq ...