首页 > 其他分享 >倍增LCA,ST表,DFS序

倍增LCA,ST表,DFS序

时间:2024-03-30 20:56:37浏览次数:20  
标签:int void DFS ST vis edge dfs LCA

DFS序

一般与线段树等综合运用,就是将树转换为线段,存在线段树中

点击查看代码
void dfs(int now)
{
	vis[now]=1;
	a[++dfscnt]=x/shuzu[x];//用途线段树 if(l==r)st[rt].val=a[l] 
	in[x]=dfscnt;
	for(int i=head[now];i;i=edge[i].next)
	{
		int to=edge[i].to;
		if(!vis[to])
		{
			dfs(to);
		}
	}
	out[now]=dfscnt;
}

ST表

\(i到i+2_{j-1}-1和i+2_{j-1}到i+2_j-1\)
注意j层循环在最外面,i层在里面
因为更新时i+(1<<(j-1))会有后效性

点击查看代码
void st()
{
	for(int i=1;i<=len;i++)
	{
		f[i][0]=a[i];
	}
	for(int j=1;(1<<j)<=len;j++)
	{
		for(int i=1;i+(1<<j)-1<=len;i++)//i+(1<<j)-1表示从i开始(1<<j)-1个长度 
		{
			f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}
}
int query(int l,int r)
{
	int k=0;
	while((1<<(k+1))<=r-l+1)k++;
	return min(f[l][k],f[r-(1<<k)+1][k]);
}

LCA

点击查看代码
int lca(int x,int y)
{
	if(d[x]<d[y])swap(x,y);
	for(int i=31;i>=0;i--)
	{
		if(d[f[x][i]]>=d[y])x=f[x][i];
	}
	if(x==y)return x;
//	for(int i=0;i<=31;i++)
	for(int i=31;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
DFS_init
点击查看代码
void dfs(int x,int fa)
{
	d[x]=d[fa]+1;
	f[x][0]=fa;
	for(int i=head[x];i;i=edge[i].next)
	{
		int to=edge[i].to;
		if(to==fa)continue;
		dis[to]=dis[x]+edge[i].w;
		dfs(to,x);
	}	
	
}
void dfs_init()//在DFS之后记得调用这个函数,血的教训
{
	for(int j=1;j<30;j++)
	{
		for(int i=1;i<=n;i++)
		{
			f[i][j]=f[f[i][j-1]][j-1];
			//dis[i][j]=min(dis[i][j-1],dis[f[i][j-1]][j-1]);
		}
	}
}
BFS_init
点击查看代码
void bfs()
{
	q.push(1);vis[1]=1;d[1]=1;
	while(q.size())
	{
		int u=q.front();q.pop();
		for(int i=head[u];i;i=edge[i].next)
		{
			int to=edge[i].to;
			if(!vis[to])
			{
				q.push(to);vis[to]=1;
				d[to]=d[u]+1;
				f[to][0]=u;
				for(int j=1;j<30;j++)f[to][j]=f[f[to][j-1]][j-1];
			}
		}
	}
}

标签:int,void,DFS,ST,vis,edge,dfs,LCA
From: https://www.cnblogs.com/wlesq/p/18105971

相关文章

  • 使用 wsl+makefile+clangd编辑stm32代码环境的搭建
    使用wsl+makefile+clangd编辑stm32代码环境的搭建安装wsl环境可以看看下面的文章安装与换源都提及,相信大家可以安装成功的https://www.cnblogs.com/banmei-brandy/p/16218660.html安装make、bear、clangd、arm-none-eabi-gcc、最新的构建库sudoaptinstallmakebearclang......
  • Numerical Results of Test1
     ......
  • 20211105BouncyCastle
    1.下载jar包https://www.bouncycastle.org/latest_releases.html找了半天在官网上没找到,是找的其他的csdn的网页二级标题将下载的两个jar包拷贝到%JAVA_HOME%\jre\lib\ext目录下面3.修改配置文件%JAVA_HOME%\jre\lib\security\java.security,在末尾添加security.provider.11......
  • Spring Boot 基本配置之依赖管理starter pom
    在SpringBoot快速搭建中搭建了一个没有任何功能的项目,查看其pom.xml文件:项目pom.xml文件有两个核心依赖,分别是spring-boot-starter-parent和spring-boot-starter。仔细观察可知spring-boot-starter-parent中有版本号,而spring-boot-star......
  • Linux下history命令简单原理
    前言在我们平时操作linux服务器时,有时候需要使用之前操作过的命令,这个时候history就派上用场了,它会记录你的历史操作命令。使用历史记录会持久化存储,默认位置是当前用户目录下的.bash_history文件。当Linux系统启动一个Shell时,Shell会从.bash_history文件中,读取......
  • codeforces div4 Double Strings
    #include<iostream>#include<algorithm>#include<cstring>#include<map>usingnamespacestd;intT,n;strings[900005];map<string,int>mm;//存放每一个字符串是否出现过intmain(){ cin>>T; while(T--){ mm.clear();//每次清空mm里面的数......
  • 面试题:Spring Boot Starter的功能与使用场景
    SpringBootStarter是SpringBoot框架为了简化项目的初始化和配置工作而设计的一种模块化依赖管理方式。它主要具有以下几个关键功能和使用场景:功能:1.依赖管理每个Starter都是一组相关的依赖项集合,这些依赖项都是为了实现特定功能而预先配置好的。例如,`spring-boo......
  • E. Nearly Shortest Repeating Substring
    #include<iostream>#include<algorithm>#include<cstring>#include<cmath>usingnamespacestd;intn,m;intmain(){ cin>>n; while(n--) { //strings; cin>>m; strings; cin>>s; intres=m; f......
  • Numerical Results of Test2
     ......
  • Rust简易入门(四)
    错误处理之:Result、Option以及panic!宏Rust中的错误可以分为两种Recoverableerror:有返回类型返回Result类型返回Option类型Unrecoverabletype:没有返回类型,直接崩溃panicmacro将终止当前线程Result是一个枚举类型,有两个变体:Ok和Err。它通常用于表示函数的执行结......