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. 关于mysql自增主键

    对于mysql表(其他数据库没测试过) 如果定义了自增主键,并且手动设置了主键的值,那么当再次自增创建数据的时候,回在设置的主键值的基础上进行自增. 如(id是主键): 起始插入(3,1),而后手动插 ...

  2. 安装virtualbox须知

    sudo usermod -a -G vboxusers `whoami`

  3. 工控随笔_04_西门子_解决Step 7软件因授权问题不能打开的方式和方法

    西门子的软件是授权软件,只有经过授权认证的用户才能使用,如果没有通过授权认证则不能 正常的使用软件的相关功能. 一.西门子授权不成功问题 如上图所示报故障代码: 000001-0505.报警文本为:未 ...

  4. idea导入svn项目

    起初和导入git项目一样,file - new - project from version control - ,这后面选 subversion. 在打开的 checkout from subver ...

  5. MFC 编辑框输入16进制字符串转换为16进制数或者10进制数据计算

    1.编辑框添加变量,并选择变量类型为CString. 2.  使用“_tcstoul”函数将Cstring 类型转换为16进制/10进制数进行计算.

  6. nice team(第一次会议)

    在周日经过一番讨论后,nice team成功上线了,四个独特的灵魂聚集在一起,想要一起做一番“大事业”,首先第一篇博客当然就是我们的成员大亮相. 詹晔康:我们组的最强王者,也是我们的项目经理.第一次讨 ...

  7. 关于anaconda中jupyter notebook错误

    anaconda这个软件是真的坑,其中的jupyter notebook每次都会出错,不知道,为什么,可惜我的pycharm装tensorflow一直有错误,不然,真想卸了这个软件. 会莫名其妙闪退, ...

  8. Java Web组件Servlet、Filter、Listener

    一.Servlet 类javax.servlet.http.HttpServlet; 1.是单例模式,一个web容器中只有一个实例.服务器调用它的service方法进行请求处理, service方法又 ...

  9. android 中activity重启的方法

    private void reLoadActivity(){ Intent intent = new Intent(context, SettingsActivity.class); intent.s ...

  10. CSS画三角形图标

    /* 等腰三角形(箭头朝上): */ #div1{ width: 0; height: 0; border-bottom: 100px solid cyan; border-left: 50px so ...