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. 带查询参数 可分页 的 T-SQL 语句写法

    ) DECLARE @pageindex int DECLARE @pagesize int DECLARE @classid int set @keys = '' ; ; ; with temptb ...

  2. Element UI toggleRowExpansion用法

    背景: 官方说明文档没有具体代码示例 一.官方文档 方法名: toggleRowExpansion 说明: 用于可展开表格,切换某一行的展开状态,如果使用了第二个参数,则是设置这一行展开与否(expa ...

  3. Optaplanner规划引擎的工作原理及简单示例(2)

    开篇 在前面一篇关于规划引擎Optapalnner的文章里(Optaplanner规划引擎的工作原理及简单示例(1)),老农介绍了应用Optaplanner过程中需要掌握的一些基本概念,这些概念有且于 ...

  4. Oracle中函数/过程返回多个值(结果集)

    Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. (1) 返回游标: return的类型为:SYS_REFCUR ...

  5. xxl-job源码分析

    1 调度中心API服务 1.任务结果回调服务: 2.执行器注册服务: 3.执行器注册摘除服务: 4.触发任务单次执行服务,支持任务根据业务事件触发: API暴露代码:com.xxl.job.admin ...

  6. (最详细)小米Note 2的usb调试模式在哪里开启的教程

    当我们使用安卓手机链接Pc的时候,或者使用的有些工具比如我们学院营销团队当使用的工具引号精灵,之前使用的老版本就需要开启USB开发者调试模式下使用,现当新版本不需要了,如果手机没有开启USB开发者调试 ...

  7. [UE4]Spline Mesh Actor

    作用: 1.按照Spline设置的轨迹,进行显示网格物体. 曲线模型 一.赋值Static Mesh,任意的Static Mesh都可以. 二.调整方向 三.Spline Mesh Actor有2个端 ...

  8. PVID和VID彻底研究(上) ——PVID的作用及和VID的区别

    http://blog.csdn.net/cybertan/article/details/8348752 另外一篇 netgear的官方文档: http://club.netgear.cn/Know ...

  9. C++常用数据结构-CString

    CString类Str.format(_T(“%d”),number)例子: str.Format(_T("%d"),number);%c 单个字符(char)%d 十进制整数(i ...

  10. Windows下搭建Python虚拟环境

    一.安装使用 virtualenv 1. 安装 virtualenv pip install virtualenv 2. 新建虚拟环境 virtualenv env1 用 Python3 创建虚拟环境 ...