1. 首页
  2. 公告
  1. 登录
  2. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文

tw202416

UID: 13790, 注册于 2024-9-20 9:42:06, 最后登录于 2026-4-2 18:31:25, 目前离线.

解决了 326 道题目,RP: 232.24 (No. 428)

♂
  • 个人简介

    强连通分量(scc):Tarjan算法

    dfn[u]表示节点u被遍历到的时间,low[u]表示节点u所能回到的最早被遍历到的节点的时间。初次遍历到节点u时,将dfn[u]、low[u]都初始化为u被遍历时的时间,并将u压入栈内

    遍历到节点u时,往下遍历节点v的两种情况:

    • 1.v被遍历过,且当前就在栈内:此时意味着v是u的一个祖先,通过min(low[u],dfn[v])更新u所能到的更早的节点
    • 2.v尚未被遍历:直接往下递归,回溯时用min(low[u],low[v])更新u所能到的更早的节点

    遍历完u所能到达的节点后,如果low[u]还是等于dfn[u],说明u无法到达更早的节点,它就是当前强连通分量的根节点。依次弹出栈内节点直到u,则弹出的节点(包括u)属于同一个强连通分量

    void Tarjan(int u){
    	dfn[u]=low[u]=++t;
    	s.push(u);
    	ins[u]=true;
    	for(int i=0;i<g[u].size();i++){
    		int v=g[u][i];
    		if(!dfn[v]){
    			Tarjan(v);
    			low[u]=min(low[u],low[v]);
    		}
    		else if(ins[v]){
    			low[u]=min(low[u],dfn[v]);
    		}
    	}
    	if(dfn[u]==low[u]){
    		int v;
    		cnt++;
    		do{
    			v=s.top();
    			s.pop();
    			ins[v]=false;
    			scc[v]=cnt;
    		}while(u!=v);
    	}
    }
    
    

    最近公共祖先(lca):倍增算法

    基本思路:对于求u,v的lca,首先将u与v的深度对齐,再向上搜索,直到找到同一个节点,而那个节点就是它们的lca

    倍增优化:令fa[u][j]表示节点u向上的第2^j个祖先。由于任何一个整数都能被拆分为几个不同的2的幂次方的和,即从二进制转为十进制的过程,所以求节点u往上的第d个祖先,可以从u往上进行几次2的幂次方的跳跃,使最终的跳跃节点个数刚好为d

    之后,我们将该方法套用到基本思路上。要对齐深度,只需让更深的点往上跳它们的深度差个点即可。而对于寻找第一个共同节点,我们要从能跳跃的最大的距离开始跳,依次减小可跳跃距离,在二者跳跃到的点不是同一个点时,我们才让它们向上跳。跳跃结束后,它们所在的节点的父节点即为它们的lca

    //初始化fa和d深度 
    void dfs(int u,int f){
    	fa[u][0]=f;
    	//往上第2^j个节点,即为第2^(j-1)个节点往上的第2^(j-1)个节点,因为2^(j-1)*2=2^j 
    	for(int i=1;i<=log2(n);i++){
    		fa[u][i]=fa[fa[u][i-1]][i-1];
    	}
    	for(int i=0;i<g[u].size();i++){
    		int v=g[u][i];
    		if(v==fa[u][0])	continue;
    		depth[v]=depth[u]+1;
    		fa[v][0]=u;
    		dfs(v,u);
    	}
    }
    //从u往上跳d个节点 
    int up(int u,int d){
    	for(int i=0;d;i++){
    		if((d&1))	u=fa[u][i];
    		d=(d>>1);
    	}
    	return u;
    }
    int lca(int u,int v){
    	if(depth[u]>depth[v])	swap(u,v);
    	int d=depth[v]-depth[u];    
    	v=up(v,d);
    	if(u==v)	return u;
    	for(int i=log2(n);i>=0;i--){
    		if(fa[u][0]!=fa[v][0]){
    			u=fa[u][i];
    			v=fa[v][i];
    		}
    	}
    	return fa[u][0];
    }
  • 最近活动

    • 【铁外】2025.12.23 数据结构-树和图基础专题测评1(图的存储和遍历、欧拉图、树的存储和遍历、二叉树)) IOI(严格)
    • 【铁外】2025.12.16 差分前缀和专题测评 IOI
    • 铁外信息学BC班限时比赛20251126 IOI(严格)
    • 2025.11.20铁外GESP四级限时赛 IOI(严格)
    • 2025 铁外-J组模拟训练赛06 OI
    • 2025 铁外-J组模拟训练赛05 OI
    • 【铁外】2025 CSP-J1初赛模拟测试1 OI
    • 2025 CSP-J1初赛模拟测试7 OI
    • 2025 CSP-J1初赛模拟测试6 OI
    • 铁外信息学B班训练集20250916 作业
    • 2025.9铁外ABC摸底测试 IOI(严格)
    • 2025TYOI暑期集训结营娱乐赛 XCPC
    • 2025.6铁外AB班算法数据结构基础检测 IOI
    • 铁外5月基础班摸底检测 IOI
    • 2025-5铁外AB班CSP-J周赛-11 IOI
    • 2025-4 铁外AB班CSP-J周赛-10 IOI
    • 2025-4 铁外AB班CSP-J周赛-08 IOI
    • 2025-4 铁外AB班CSP-J周赛-07 IOI
    • 2025-3 铁外AB班CSP-J周赛-06 IOI
    • 2025-3 铁外AB班CSP-J周赛-04 IOI
    • 2025铁外AB班CSP-J周赛-03 IOI
    • 2025铁外AB班CSP-J周赛-02 IOI
    • 2025铁外AB班CSP-J周赛-01 IOI
    • 铁外信息学作业-AB班(25年3月份-线性动态规划基础) 作业
    • 铁外信息学作业-AB班(25年2月-二分搜索) 作业
    • 铁外信息学作业-AB班(25年2月份-广度优先搜索) 作业
    • 【oiClass公益赛】2025CSP-J模拟赛#01 OI
    • 铁外信息学作业-CD班(25年1月-循环结构、数组) 作业
    • 铁外信息学作业-AB班(25年1月-深搜算法) 作业
    • 铁外AB-12月第14周-递归算法1 作业
    • 铁外初级组十二月份 作业
    • 2024铁外初级组测试1130 IOI
    • 铁外初级组十一月份(一) 作业
    • 铁外初级组十月份(二) 作业
    • 铁外初级组十月份(一) 作业
    • 铁外信息学初级组作业0925 作业
  • Stat

  • Rating

661
已递交
326
已通过
0
题解被赞

状态

  • 评测队列
  • 服务状态

开发

  • 开源

支持

  • 帮助
  • 联系我们

关于

  • 关于
  • 隐私
  • 服务条款
  • 版权申诉
  1. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
  2. 兼容模式
  3. 主题
    1. 亮色
    2. 暗色
  1. 粤ICP备2024335011号
  2. Worker 0, 10ms
  3. Powered by Hydro v5.0.0-beta.18 Community
关闭

登录

使用您的 oiClass 通用账户

忘记密码或者用户名?