1、一颗树中,给出a,b,求最近的距离。(我没考虑不联通的情况,即不是一颗树的情况)

2、用最近公共祖先来求,

记下根结点到任意一点的距离dis[],这样ans = dis[u] + dis[v] - 2 * dis[lca(u, v)]

3、

/*
离线算法,LCATarjan
复杂度O(n+Q);
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; const int MAXN=;
const int MAXQ=;//查询数的最大值 int dis[MAXN];//到根节点的距离 //并查集部分
int F[MAXN];//需要初始化为-1
int find(int x){
if(F[x]==-)return x;
return F[x]=find(F[x]);
}
void bing(int u,int v){
int t1=find(u);
int t2=find(v);
if(t1!=t2)
F[t1]=t2;
}
//***********************
bool vis[MAXN];//访问标记
int ancestor[MAXN];//祖先
struct Edge{
int to,next;
int d;
}edge[MAXN*];
int head[MAXN],tot;
void addedge(int u,int v,int d){
edge[tot].to=v;
edge[tot].d=d;
edge[tot].next=head[u];
head[u]=tot++;
} struct Query{
int q,next;
int index;//查询编号
}query[MAXQ*];
int answer[MAXQ];//存储最后的查询结果,下标0 Q-1
int h[MAXN];//注意此处为MAXN...
int tt; void add_query(int u,int v,int index){
query[tt].q=v;
query[tt].next=h[u];
query[tt].index=index;
h[u]=tt++;
query[tt].q=u;
query[tt].next=h[v];
query[tt].index=index;
h[v]=tt++;
} void init(){
tot=;
memset(head,-,sizeof(head));
tt=;
memset(h,-,sizeof(h));
memset(vis,false,sizeof(vis));
memset(F,-,sizeof(F));
memset(ancestor,,sizeof(ancestor));
}
void LCA(int u){
ancestor[u]=u;
vis[u]=true;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(vis[v])continue;
dis[v]=dis[u]+edge[i].d;
LCA(v);
bing(u,v);
ancestor[find(u)]=u;
}
for(int i=h[u];i!=-;i=query[i].next){
int v=query[i].q;
if(vis[v]){
answer[query[i].index]=ancestor[find(v)];
}
}
} int main(){
int n,m;
int i;
int u,v,d;
char str[]; init();
scanf("%d%d",&n,&n);
for(i=;i<n;++i){
scanf("%d%d%d%1s",&u,&v,&d,str);
addedge(u,v,d);
addedge(v,u,d);
}
scanf("%d",&m);
for(i=;i<m;++i){
scanf("%d%d",&u,&v);
add_query(u,v,i);
}
dis[]=;
LCA();
for(i=;i<m;++i){
printf("%d\n",dis[query[i*].q]+dis[query[i*+].q]-*dis[answer[i]]);
} return ;
}

最新文章

  1. 经典信息图表:2013 扁平设计 VS 拟物设计
  2. jQuery常规选择器
  3. Asp.net Vnext IValueProvider
  4. XForms标准介绍
  5. 宏buf_pool_struct
  6. Replace - with an en dash character (–, –) ?
  7. trove taskmanger api
  8. 一个3D视频播放器的演示APK
  9. HTML标签元素分类(HTML基础知识)
  10. 防止js全局变量污染方法总结
  11. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十六 ║Vue基础:ES6初体验 &amp; 模块化编程
  12. activemq读取剩余消息队列中消息的数量
  13. java中的标识符、修饰符、关键字
  14. C++ 读取字符串中的数字
  15. springcloud学习计划
  16. 运行成功的Demo(Python+Appium)
  17. git clone 指定分支 拉代码
  18. 【转】Android7.0适配心得
  19. Cygwin、MinGw、mingw-w64,MSys msys2区别与联系
  20. 【TCP/IP详解 卷一:协议】第二十三章 TCP的保活定时器

热门文章

  1. 两行代码搞定UI主流框架
  2. oc温习二:基本运算及基本运算符
  3. C. The Two Routes---cf602C(Dij)
  4. POJ 1860【求解是否存在权值为正的环 屌丝做的第一道权值需要计算的题 想喊一声SPFA万岁】
  5. linux命名详解及其软件安装实例
  6. day5-WordCount
  7. [Tools] Create a Chrome Extension
  8. Office EXCEL 创建图片超链接打不开怎么办 Excel打开图片提示发生了意外错误怎么办
  9. Vs2012在Linux开发中的应用(5):项目属性的定义
  10. performSelector调用和直接调用的区别