倍增LCA code[vs]1036商务旅行

n个点用n-1条边连接,求两个点间的最短路

显然可以想到用floyd预处理,但复杂度过高

所以一些巨发明了LCA

为什么这类最短路问题要找最近公共祖先,这是一个显然的问题,最近公共祖先说简陋了就是在这个“树”上找一个“转折点"

LCA分为离线和在线两种,这里先写在线的方法

 

在线LCA运用的思想是倍增

何为倍增?

在我这个渣看来,一个正整数是可以写成一个或多个n不相同的2^n的和

那么一些时候就可以依据这一特征进行算法优化,log一下复杂度就大大降低了

 

具体的代码实现大体分三部分

首先是用邻接表实现的深搜,得到每个点的“深度”(将这个图看成树)

需要注意的是for循环中间i的判断条件与memset初始化的head[]数组值有关

f[edge[i].to][0]记录的值为其父节点

1 void dfs(int p){
2     for(int i=head[p];i;i=edge[i].next){
3         if(!deep[edge[i].to]){
4             deep[edge[i].to]=deep[p]+1;
5             f[edge[i].to][0]=p;
6             dfs(edge[i].to);
7         }
8     }    
9 }

 

接着是对f[][]数组预处理

f[i][j] 表示点i向上走2^j步到达的点p 

f[i][j-1] 表示节点i向上走2^(j-1)步到达的节点p' 

p'再向“上”走2^j-2^(j-1)=2^(j-1)步则可到达p

所以可以得到递推式f[i][j]=f[f[i][j-1]][j-1]

1 void work(){
2    for(int j=1;(1<<j)<=n;j++)
3         for(int i=1;i<=n;i++)
4             if(f[i][j-1]!=-1)
5                 f[i][j]=f[f[i][j-1]][j-1];
6 }

 

最后就是LCA核心

这里的i需要单独定义出来

注意依据深度aa和bb,一定要从下向上走的吧

 1 int lca(int aa,int bb){
 2     int i;
 3     if(deep[aa]<deep[bb]) swap(aa,bb);
 4     for(i=0;(1<<i)<=deep[aa];i++);
 5     i--;
 6     for(int j=i;j>=0;j--) 
 7         if(deep[aa]-(1<<j)>=deep[bb])
 8             aa=f[aa][j];  
 9     if(aa==bb) return aa; 
10     for(int j=i;j>=0;j--){
11         if(f[aa][j]!=-1&&f[aa][j]!=f[bb][j]){
12             aa=f[aa][j];
13             bb=f[bb][j];
14         }
15     }
16     return f[aa][0];
17 }

 

附一模板题

1036 商务旅行

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 钻石 Diamond
题目描述 Description

某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间。

假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间。该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环。

你的任务是帮助该商人计算一下他的最短旅行时间。

输入描述 Input Description

输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目。下面N-1行,每行由两个整数a 和b (1<=ab<=n; a<>b)组成,表示城镇a和城镇b有公路连接。在第N+1行为一个整数M,下面的M行,每行有该商人需要顺次经过的各城镇编号。

输出描述 Output Description

在输出文件中输出该商人旅行的最短时间。

样例输入 Sample Input
5
1 2
1 5
3 5
4 5
4
1
3
2
5
样例输出 Sample Output
7
注意一下f[][]数组赋初值的问题就好
贴代码
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n=0,x=0,y=0,cnt=0,head[30010],deep[30010],f[30010][33],m=0,a=0,b=0,ans=0;
 7 struct data{
 8     int next,to;
 9 }edge[60010];
10 
11 void add(int start,int end){
12     edge[++cnt].next=head[start];
13     edge[cnt].to=end;
14     head[start]=cnt;
15 }
16 
17 void dfs(int p){
18     for(int i=head[p];i;i=edge[i].next){
19         if(!deep[edge[i].to]){
20             deep[edge[i].to]=deep[p]+1;
21             f[edge[i].to][0]=p;
22             dfs(edge[i].to);
23         }
24     }    
25 }
26 
27 void work(){
28    for(int j=1;(1<<j)<=n;j++)
29         for(int i=1;i<=n;i++)
30             if(f[i][j-1]!=-1)
31                 f[i][j]=f[f[i][j-1]][j-1];
32 }
33 
34 int lca(int aa,int bb){
35     int i;
36     if(deep[aa]<deep[bb]) swap(aa,bb);
37     for(i=0;(1<<i)<=deep[aa];i++);
38     i--;
39     for(int j=i;j>=0;j--) 
40         if(deep[aa]-(1<<j)>=deep[bb])
41             aa=f[aa][j];  
42     if(aa==bb) return aa; 
43     for(int j=i;j>=0;j--){
44         if(f[aa][j]!=-1&&f[aa][j]!=f[bb][j]){
45             aa=f[aa][j];
46             bb=f[bb][j];
47         }
48     }
49     return f[aa][0];
50 }
51 
52 int main(){
53     scanf("%d",&n);
54     memset(head,0,sizeof(head));
55     memset(deep,0,sizeof(deep));
56     memset(f,-1,sizeof(f));
57     for(int i=1;i<n;i++){
58         scanf("%d%d",&x,&y);
59         add(x,y);
60         add(y,x);
61     }
62     deep[1]=1;   
63     dfs(1);
64     work();
65 
66     scanf("%d",&m);
67     scanf("%d",&a);
68     for(int i=1;i<m;i++){
69         scanf("%d",&b);
70         ans+=deep[a]+deep[b]-2*deep[lca(a,b)];
71         a=b;
72     }
73     printf("%d\n",ans);
74     return 0;
75 }

 

 

转载于:https://www.cnblogs.com/sdfzxh/p/6670125.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java过滤器的原理_Java 三大器之过滤器(Filter)工作原理

Filter 简介filter称为过滤器&#xff0c;可以对web 服务器管理的所有资源: Jsp, Servlet&#xff0c;静态图片文件或静态html文件等进行拦截&#xff0c;从而实现一些特殊的功能。例如实现URL级别的权限访问控制&#xff0c;过滤敏感词汇&#xff0c;压缩响应信息等高级功能。…

Python文件操作-文件的增删改查

需求:对文件进行增删改查 由于时间原因,本次代码没有增加任何注释,如有疑问,请联系编辑者:闫龙 其实我也是醉了,看着这些个代码,我脑袋也特么大了,没办法,大神说了,不让用新知识,只可以使用学过的,所以代码复用就不用说了,根本不可能了,希望大家可以看懂这些,别人啃着糟心,自己…

spring事务三大接口

1.事务三大接口 PlatformTransactionManager 事务管理器TransactionDefinition 事务的一些基础信息&#xff0c;如超时时间、隔离级别、传播属性等TransactionStatus 事务的一些状态信息&#xff0c;如是否一个新的事务、是否已被标记为回滚PlatformTransactionManager //根据…

与你相遇——博客园

显示注册博客园已经一年多了&#xff0c;但是却没有一篇文章&#xff0c;从今天开始每天有学习&#xff0c;每天就必有输出。平常自己的学习效率往往很低&#xff0c;有时经常感动自己学了多少东西&#xff0c;可是记住的不多&#xff0c;想通过记笔记方式掩饰战略上的懒惰&…

java 类隔离_Java类装载体系中的隔离性

正文Java中类的查找与装载出现的问题总是会时不时出现在Java程序员面前&#xff0c;这并不是什么丢脸的事情&#xff0c;相信没有一个Java程序员没遇到过ClassNotException,因此不要为被人瞅见自己也犯这样的错误而觉得不自然&#xff0c;但是在如果出现了ClassNotFoundExcepti…

java用easyexcel实现读取excell表格内容

引入依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><!-- https:…

关于移动端的一些tip

移动端的一些tip 开发相关 关于viewport <meta name"viewport" content"namevalue,namevalue"> // 指令 每对键值对都是一个指令&#xff0c;&#xff08;ppk 大神的叫法&#xff09;以下总计共有6对&#xff1a; width设置layout viewport的宽度&am…

java常见异常思维导图_21_异常_第21天(异常、企业面试题,思维导图下载)

今日内容介绍1、异常概述和继承体系2、异常原因以及处理方式3、运行时期异常4、方法重写的异常处理5、Throwable类常见方法6、自定义异常01异常的概述* A: 异常的概述* a:什么是异常* Java代码在运行时期发生的问题就是异常。* b:异常类* 在Java中&#xff0c;把异常信息封装成…

Spring中的InitializingBean接口的使用

InitializingBean接口为bean提供了初始化方法的方式&#xff0c;它只包括afterPropertiesSet方法&#xff0c;凡是继承该接口的类&#xff0c;在初始化bean的时候会执行该方法&#xff0c;具体说spring初始化bean之后执行该方法 配置文件 <bean id"userServices"…

WLAN

WPA加密 1&#xff0e;WPA的功能是替代现行的WEP&#xff08;Wired Equivalent Privacy&#xff09;协议。WPA是继承了WEP基本原理而又解决了WEP缺点的一种新技术。由于加强生成加密密钥的算法&#xff0c;因此即便收集到分组信息并对其进行解析&#xff0c;也几乎无法计算出通…

Spring事务CallbackPreferringPlatformTransactionManager

CallbackPreferringPlatformTransactionManager if (txInfo.transactionAttribute ! null && txInfo.transactionAttribute.rollbackOn(ex)) {} 判断属性的默认值不为nul l且判断当前的异常是RuntimeException还是Error&#xff0c;会返回1&#xff0c;其他异常返回0…

java ranger rest_kafka ranger integration issuse

kafka-rangerranger-1.0.0 kafka-1.0.0(confluent-4.0.0)安装ranger-1.0.0-kafka-plugin下面是安装过程中遇到的一些问题下载并解压 ranger-1.0.0-kafka-plugin.tar.gz修改配置文件install.propertiesCOMPONENT_INSTALL_DIR_NAME/usr/local/confluent/POLICY_MGR_URLhttp://192…

vuejs组件通信

<body><div id"example"><father></father></div> </body> <script>Vue.component(child, {// 声明 propsprops: [message],// 就像 data 一样&#xff0c;prop 可以用在模板内// 同样也可以在 vm 实例中像 “this.messag…

Windows 10 Creators Update [ISO官方镜像][15063][1703][x64][x86][创意者更新正式版]

请把下载地址手动复制到迅雷里面去,谢谢! 【64 位简体中文专业/家庭版】 文件名&#xff1a;cn_windows_10_multiple_editions_version_1703_updated_march_2017_x64_dvd_10194190.iso SHA1&#xff1a;054C741DED8989F4D0D419946EB37182F20E4482 文件大小&#xff1a;4.27GB 下…

@PostConstruct注解学习

PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。 Java中该注解的说明&#xff1a;PostConstruct该注解被用来修饰一个非静态的void&#xff08;&#xff09;方法。被PostConstruct修饰的方法会在服务器加载Servlet的时候运行&#xff0c;并且只会被服务器…

java mathematica_用Java获取Mathematica图像

我试图使用J / Link从Mathematica获取图像到Java.我可以在Mathematica中打印图像,如下所示&#xff1a;Print[ Graphics[Raster[ img[[1]] ], AspectRatio->Automatic, ImageSize->530 ] ];我试过以各种方式从Mathematica函数返回数据&#xff1a;Return [ Image[Graphic…

C语言 · 出栈次序

标题&#xff1a;出栈次序 X星球特别讲究秩序&#xff0c;所有道路都是单行线。一个甲壳虫车队&#xff0c;共16辆车&#xff0c;按照编号先后发车&#xff0c; 夹在其它车流中&#xff0c;缓缓前行。 路边有个死胡同&#xff0c;只能容一辆车通过&#xff0c;是临时的检查站&a…

idea for mac 控制台 mvn command not found

一&#xff1a;现在的IDEA 自带maven库maven库的地址如下图查看 二:完idea 需要配置maven库的环境变量才能找到该命令 Mac系统的环境变量&#xff0c;加载顺序为&#xff1a; a. /etc/profile b. /etc/paths c. ~/.bash_profile d. ~/.bash_login e. ~/.profile f. ~/.bashrc 其…