参考博客

参考博客

根据博客的模拟,就可以知道做法和思想。

现在就是实现他。

例题 :hdu  2586 

题意:m 个询问,x  到  y  的距离,我们的思想就是求出:x到根的距离+y到根的距离-2*(lca[ x ,y ])到跟的距离。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int max_edge=;//边数
const int max_Q=;//问题
const int max_=;//节点
struct Tree{//树-邻接表
int to;
int v;
int next;
};
struct Question{//离线-问题
int to;
int id;
int next;
};
struct Tree a[max_edge];//树数组
struct Question b[max_];//问题数组
int N,M;
int edge[max_];//边记录next
int tot1,tot2;
bool vis[max_];//标记数组
int st[max_Q],ed[max_Q];//问题的x和y
int question[max_];//问题-记录next
int fa[max_];//父节点
int dis[max_];//到根的距离
int LCA[max_Q];//问题的LCA
void add_edge(int x,int y,int v)//建树
{
a[++tot1].to=y;
a[tot1].v=v;
a[tot1].next=edge[x];
edge[x]=tot1;
}
void add_question(int x,int y,int id)//离线
{
b[++tot2].to=y;
b[tot2].id=id;
b[tot2].next=question[x];
question[x]=tot2;
}
int find_fa(int x)//寻找父节点
{
if(fa[x]==x)
return x;
return fa[x]=find_fa(fa[x]);
}
void Tarjan(int x)
{
fa[x]=x;//作为当前的根节点,将其父亲指向自己
vis[x]=;//标记
for(int i=question[x];i;i=b[i].next)//寻找问题中与自己有关节点
{
int go_to=b[i].to;
if(vis[go_to]==true)//如果有关节点走过,记录LCA
LCA[b[i].id]=find_fa(go_to);
}
for(int i=edge[x];i;i=a[i].next)//沿边遍历
{
int go_to=a[i].to;
if(vis[go_to]==false)
{
dis[go_to]=dis[x]+a[i].v;//更新距离
Tarjan(go_to);//递归遍历
fa[go_to]=x;//归并父节点
}
}
}
int main()
{
int T;
cin>>T;//测试组数
while(T--)
{
memset(vis,,sizeof(vis));
memset(question,,sizeof(question));
memset(edge,,sizeof(edge));
memset(dis,,sizeof(dis));
memset(LCA,,sizeof(LCA));
tot1=,tot2=;//初始归零
cin>>N>>M;
for(int i=;i<N-;i++)
{
int x,y,v;
cin>>x>>y>>v;
add_edge(x,y,v);//双向建边
add_edge(y,x,v);
}
for(int i=;i<M;i++)
{
int x,y;
cin>>x>>y;
add_question(x,y,i);
add_question(y,x,i);//保证找有关点时不漏
st[i]=x,ed[i]=y;//记录问题的x,y
}
Tarjan();
for(int i=;i<M;i++)
{
int temp=dis[st[i]]+dis[ed[i]]-(*dis[LCA[i]]);//结果
cout<<temp<<endl;
}
}
}

最新文章

  1. 扎克伯格开发的家用AI: Jarvis
  2. 启动Mysql服务提示Can’t connect to local MySQL server through socket的解决方法
  3. Java网络编程——TCP实例
  4. 转:NLog 自定义日志内容,写日志到数据库;修改Nlog.config不起作用的原因
  5. 《RESTful Web Services》第三章 设计表述
  6. Java+Mysql+学生管理系统
  7. c++实现精确计时
  8. 《UNIX环境高级编程》笔记--sigaction函数
  9. 循环神经网络RNN公式推导走读
  10. mysql日期函数 当前日期 curdate() , 当前年 year(curdate()), 取date的年份 year(date) ,取date的月份 month(date)
  11. C4.5算法(摘抄)
  12. C# 模拟网站登陆并截图
  13. 某里巴巴Java工程师常规面试题以及解答
  14. 2017.9.16~17,热烈庆祝共创力罗老师《敏捷MINI体验式实战培训》在某大型企业成功举办!
  15. typeof(), __typeof(), __typeof__(), -isKindOfClass:的区别
  16. 【Python全栈-CSS】CSS入门
  17. Prometheus监控学习笔记之Prometheus监控简介
  18. 第2节 常用软件安装-JDK和Tomcat
  19. 包学会之浅入浅出Vue.js:升学篇
  20. 图解Ajax工作原理

热门文章

  1. Vue手把手教你撸一个 beforeEnter 钩子函数
  2. jquery hover中嵌套mouseenter,mouseenter函数执行多次的问题解决方案
  3. 第四章 K8s部署安装
  4. Samba服务的安装
  5. 文件对比工具 diff cmp patch(没弄完) pr
  6. 【JDK1.8】Java 栈实现方式
  7. Java基本数据类型的类型转换规则
  8. div::before一个能插入元素的选择器
  9. nginx获取头部信息带下划线,获取不到解决方案
  10. 前端避免XSS(跨站脚本攻击)