首页 > 其他分享 >11.21学习小结 //LCA

11.21学习小结 //LCA

时间:2023-11-22 15:55:40浏览次数:39  
标签:ck dep int root 11.21 fa MAXN LCA 小结

倍增求LCA

参考博文:https://www.cnblogs.com/hulean/p/11144059.html
参考博文:https://www.cnblogs.com/jvxie/p/4854719.html
· 记录每个点的深度,和往前2^i的祖先。
· 先把两个点提到同一高度,再统一开始跳。不可以直接跳到相同祖先处,因为可能是LCA的祖先
· 裸板子:洛谷P3379
waring:祖先是在dfs里面更新的

#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+10;
vector<int>e[MAXN];
int dep[MAXN];
int vis[MAXN];
int fa[MAXN][25];
void dfs(int x){
	vis[x]=1;
	for(auto i:e[x]){
		if(vis[i])continue;
		dep[i]=dep[x]+1;
		fa[i][0]=x;
		for(int j=1;(1<<j)<=dep[i];j++){
			fa[i][j]=fa[fa[i][j-1]][j-1];
		}
		dfs(i);
	}
}
void lca(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	for(int j=20;j>=0;j--){
		if((1<<j)>dep[u]-dep[v])continue;
		u=fa[u][j];
	}
	if(u==v){
		cout<<u<<endl;
		return;
	}
	for(int j=20;j>=0;j--){
		if((1<<j)>dep[u])continue;
		if(fa[u][j]==fa[v][j])continue;
		u=fa[u][j];v=fa[v][j];
	}
	cout<<fa[u][0]<<endl;
}
int main(){
	int n,m,root;
	cin>>n>>m>>root;
	int u,v;
	for(int i=1;i<=n-1;i++){
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dep[root]=0;
	fa[root][0]=root;
	dfs(root);
	while(m--){
		cin>>u>>v;
		lca(u,v);
	}
	return 0;
} 

·洛谷P5836
waring:记录本身颜色!!!

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
vector<int>e[MAXN];
int dep[MAXN];
int vis[MAXN];
int cl[MAXN];
int fa[MAXN][25][3];
void dfs(int x){
	vis[x]=1;
	for(auto i:e[x]){
		if(vis[i])continue;
		dep[i]=dep[x]+1;
		fa[i][0][0]=x;
		fa[i][0][1]=cl[x]==1;
		fa[i][0][2]=cl[x]==2; 
		for(int j=1;(1<<j)<=dep[i];j++){
			fa[i][j][0]=fa[fa[i][j-1][0]][j-1][0];
			fa[i][j][1]=fa[i][j-1][1]||fa[fa[i][j-1][0]][j-1][1];
			fa[i][j][2]=fa[i][j-1][2]||fa[fa[i][j-1][0]][j-1][2];
		}
		dfs(i);
	}
}
bool lca(int u,int v,int k){
	int ck=0;
	if(cl[u] == k || cl[v] == k)return true;
	if(dep[u]<dep[v])swap(u,v);
	for(int j=20;j>=0;j--){
		if((1<<j)>dep[u]-dep[v])continue;
		if(fa[u][j][k]==1){
			ck=1;
			return ck;
		}
		u=fa[u][j][0];
	}
	if(u==v){
		if(cl[u]==k)ck=1;
		return ck;
	}
	for(int j=20;j>=0;j--){
		if((1<<j)>dep[u])continue;
		if(fa[u][j][0]==fa[v][j][0])continue;
		if(fa[u][j][k] || fa[v][j][k]){
			ck=1;
			return ck;
		}
		u=fa[u][j][0],v=fa[v][j][0];
	}
	if(cl[fa[u][0][0]]==k)ck=1;
	return ck; 
}
int main(){
	int n,m;
	cin>>n>>m;
	int u,v;
	char c;
	for(int i=1;i<=n;i++){
		cin>>c;
		if(c=='G')cl[i]=1;
		else cl[i]=2;
	}
	for(int i=1;i<=n-1;i++){
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	int root=1;
	dep[root]=0;
	fa[root][0][0]=root;
	dfs(root);
//	
//	for(int i=1;i<=n;i++){
//		for(int j=0;(1<<j)<=dep[i];j++){
//			for(int k=0;k<=2;k++){
//				cout<<fa[i][j][k];
//			}
//			cout<<endl;
//		} 
//		cout<<endl;
//	}
//	
	while(m--){
		cin>>u>>v>>c;
		if(c=='G')cout<<lca(u,v,1);
		else cout<<lca(u,v,2);
	}
	return 0;
} 

标签:ck,dep,int,root,11.21,fa,MAXN,LCA,小结
From: https://www.cnblogs.com/muyi-meow/p/17847216.html

相关文章

  • 11.21b级请假审批实现了
           <!DOCTYPEhtml><htmlxmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"><metaname="renderer"content="webkit"><metahttp-equiv=......
  • 11.21打卡
    1.复制IP(93)有效IP地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和"192.168.1.1" 是 有效 IP地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效 IP地址。给定一个只......
  • 11.21每日总结
    实验内容与完成情况:(一) 编程实现以下指定功能,并用Hadoop提供的HBaseShell命令完成相同任务:  List列出hbase的表  查看表中的数据并且向指定表中添加数据。  删除列族。  统计表的行数和删除表。(二) HBase数据库操作1.创建表。     ......
  • 11.21
    昨天没闲话。3yy今天评价学校水龙头:你在二楼是找不到几个正常的水龙头的。说的很对,因为二楼的水龙头歪的比正常的还多。放假时候B站主页给我推了galgame?看来我调教的挺好。游戏名叫《他和她和她的恋爱》我去,纯爱神作(然而并不是),看了这游戏的讲解给我震撼到了,这剧情是牛的吧,世界......
  • 每日总结11.21
    HBase数据库操作(1)createTable(StringtableName,String[]fields)创建表,参数tableName为表的名称,字符串数组fields为存储记录各个字段名称的数组。要求当HBase已经存在名为tableName的表的时候,先删除原有的表,然后再创建新的表。(2)addRecord(StringtableName,Stringrow,Stri......
  • 聪明办法学Python_task1_11.20-11.21
    聪明办法学Python_task1_11.20-11.211.task011.1Python灵魂三问1.2Python环境配置2.task022.1注释2.2基本控制台输出2.3错误2.4基本控制台输入2.5导入模块1.task01:Python简介/安装1.1Python灵魂三问为什么学Python?Python是全球最流行的编程语言......
  • 2023.11.21做题笔记(对局匹配,砝码称重shui,单词接龙)
    今天水了一节英语课,翘了一节C++课,就是感觉摆的一批。 对局匹配P8656[蓝桥杯2017国B]对局匹配-洛谷|计算机科学教育新生态(luogu.com.cn)   对于这道题:大佬解法1:#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn,k,a[N],an......
  • Java Junit5 使用小结
    在我们的日常开发中,代码一边编码一边自测是常有的事,做好单元测试也是一名开发应该掌握的技能,不说测试搞得多么强,至少会基本的,会功能测试,会性能测试。今天来学习下单元测试。1.JUnit5介绍现在主要版本是JUnit5,所以后面的内容也都是基于JUnit5做相关的介绍。JUnit5是JUnit......
  • 2023.11.21——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.JavaGUI2.会话跟踪技术明日计划:学习......
  • 11.21每日总结
    今日时间:5h代码行数300学习内容:早上学习大数据的hbase的知识,打开hbase的指令是hbase打开方法,/export/server/hbase/bin/hbaseshell点击list查看表创建表得自己创建,creat‘表名’,‘列1‘,’列2‘,不知怎么必须用创建的,自己的还不行,还得是英文,学习计算机全是英文,当初我们的老祖......