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