博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU - 6115 Factory (LCA 倍增)
阅读量:7055 次
发布时间:2019-06-28

本文共 1640 字,大约阅读时间需要 5 分钟。

题目传送门:

题目大意:

(中文题,简单解答下题意)

存在N个城市和M个百度的子公司,N个城市间有N-1条道路连接(一颗树),每个子公司都有办公室,办公室分布在各个城市,现在提问,两个子公司间的最小距离。

分析:

枚举提问的两个子公司的办公室间的距离,求出最短距离即可:

例如:子公司company1办公室在城市 1 2 3     子公司company2的办公室在城市5 6 ,若求company1,company2的最短距离,即枚举(1,5)、(1,6)、(2,5)、(2,6)、(3,5)、(3,6)的距离,求出最小值即可。

求距离:设求城市a,b的距离,先用倍增求出lca(a,b),然后dis=dis[a]+dis[b]-2*dis[lca(a,b)]得到距离;

代码:

#include
#include
#include
#include
using namespace std;const int MAX=100009;const int M=20;int t,n,m,a,b,val,num,q;int head[MAX],cnt=0;int up[MAX][M];int deep[MAX];int dis[MAX];vector
comp[MAX];struct Edge{ //存树 int next,to,val;}edge[MAX*2];inline void add(int u,int v,int w){ edge[cnt].to=v; edge[cnt].val=w; edge[cnt].next=head[u]; head[u]=cnt++;}void dfs(int u) //dfs遍历求出深度和距离 { for(int i=head[u];i!=-1;i=edge[i].next) { int to=edge[i].to; if(to==up[u][0])continue; deep[to]=deep[u]+1; up[to][0]=u; dis[to]=dis[u]+edge[i].val; dfs(to); }}void init() { for(int j=1;(1<
<=n;j++) for(int i=1;i<=n;i++) up[i][j]=up[up[i][j-1]][j-1];}int lca(int a,int b){ if(deep[a]
=0;i--) { if(up[a][i]!=up[b][i]) { a=up[a][i];b=up[b][i]; } } return up[a][0];}int main(){ scanf("%d",&t); while(t--) { memset(head,-1,sizeof(head));cnt=0; //初始化 memset(up,0,sizeof(up)); memset(deep,0,sizeof(deep)); memset(dis,0,sizeof(dis)); for(int i=0;i

 

转载于:https://www.cnblogs.com/LjwCarrot/p/9689750.html

你可能感兴趣的文章
Java内存区域与内存溢出异常
查看>>
关于kali小问题解决
查看>>
chrome 调试 websocket
查看>>
Fedora 29 Linux发行版发布
查看>>
初解Python爬虫(一)
查看>>
基于Helm和Operator的K8S应用管理的分享
查看>>
scss指令笔记
查看>>
vue常用的小知识点
查看>>
Sketch 和 PS中的设计图如何实现“自动切图”?
查看>>
赴日工作之在留换签证
查看>>
Java多线程总结
查看>>
异常记录:SunCertPathBuilderException: unable to find valid certification path to requested target...
查看>>
centos7 install docker-ce
查看>>
解读阿里云oss-android/ios-sdk 断点续传(多线程)
查看>>
oracle中的null
查看>>
SSH2项目搭建
查看>>
LINUX 20187月最全Linux命令
查看>>
python数据类型转化与字符串操作
查看>>
sf接口
查看>>
jeeplus分页-----代码生成的方法
查看>>