首页 > 编程语言 >最近公共祖先 Tarjan算法

最近公共祖先 Tarjan算法

时间:2023-09-24 19:47:27浏览次数:38  
标签:taryan Tarjan 祖先 back int 算法 push query find

P3379 【模板】最近公共祖先(LCA)

利用并查集

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
vector<int> g[N];
vector<pair<int,int>> query[N];
int ans[N],vis[N];
int f[N];
int find(int x) {
	return f[x] == x ? x : f[x] = find(f[x]);
}
void taryan(int u,int father) {
	vis[u] = 1;//标记
	for (auto v : g[u]) {
		if (v == father) continue;
		taryan(v, u);
		f[v] = u;//回u时,v指向u
	}
	//离u时,枚举LCA
	for (auto v : query[u]) {
		int i = v.second, t = v.first;
		if (vis[t]) ans[i] = find(t);
	}
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n, m, S;
	cin >> n >> m >> S;
	for (int i = 1; i <= n; i++) f[i] = i;
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	for (int i = 1; i <= m; i++) {
		int a, b;
		cin >> a >> b;
		query[a].push_back({ b,i });
		query[b].push_back({ a,i });
	}
	taryan(S,0);
	for (int i = 1; i <= m; i++) {
		cout << ans[i] << '\n';
	}
	return 0;
}

标签:taryan,Tarjan,祖先,back,int,算法,push,query,find
From: https://www.cnblogs.com/bu-fan/p/17726489.html

相关文章

  • 实现一致性哈希算法
    背景一致性哈希主要用于分布式系统解决数据存储与访问的负载问题,极大的提高了可用性与扩展性。分布式系统往往是把数据分布到不同的节点,这些节点可以动态的加入或离开集群,这样就需要考虑一些问题,如果按照传统的hash算法进行数据分布,动态扩缩节点就需要对数据进行rehash,数据量大或......
  • 一致性哈希算法实现(java)
    代码基本实现未完待续........... publicstaticvoidmain(String[]args){​TreeMap<Integer,String>hashNodes=newTreeMap<>();hashNodes.put(1,"1.1.1.1");hashNodes.put(4,"1.1.1.2");hashNodes.put......
  • 最近公共祖先 倍增算法
    P3379【模板】最近公共祖先(LCA)点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+10;vector<int>g[N];intdep[N],fa[N][22];voiddfs(intu,intfather){ dep[u]=dep[father]+1; fa[u][0]=father;//2的i次方的点 for(inti=......
  • 文心一言 VS 讯飞星火 VS chatgpt (99)-- 算法导论9.3 5题
    五、用go语言,假设你已经有了一个最坏情况下是线性时间的用于求解中位数的“黑箱”子程序。设计一个能在线性时间内解决任意顺序统计量的选择问题算法。文心一言:为了在线性时间内解决任意顺序统计量的选择问题,我们可以使用一个基于快速选择算法的方法。快速选择算法是基于快速排序的......
  • 算法打卡|Day4 链表part02
    Day4链表part02今日任务●24.两两交换链表中的节点●19.删除链表的倒数第N个节点●面试题02.07.链表相交●142.环形链表II[TOC]Problem:24.两两交换链表中的节点思路1.迭代法就要注意画图!画图!还是画图!另外迭代的次序不要忘记,链表迭代统一从左往右迭代。用三......
  • 深度学习算法中的遗传编程(Genetic Programming)
    深度学习算法中的遗传编程(GeneticProgramming)引言深度学习算法在近年来取得了巨大的成功,广泛应用于计算机视觉、自然语言处理等领域。然而,深度学习算法仍然面临着一些挑战,例如需要大量的标注数据、模型结构的选择等。为了解决这些问题,研究者们开始探索结合遗传编程(GeneticProgram......
  • 算法刷题:图论(9.23,持续更)
    目录基础知识有向图顶点类邻接表邻接矩阵入度、出度有向加权图无向图(双向图)图的遍历题目DAG所有可能的路径判断二分图dfs解法bfs解法基础知识点:顶点、邻接节点边:有向边、无向边、加权边度:入度、出度、无向边的度环:环、自环(glist[i]中有i)连通性:连通图、不连通有向图顶点......
  • 【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)
    农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。FJ伤心地......
  • 9.24算法
    反转链表给你单链表的头节点head,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[] 提示:链表中节点的数目范围是[0,5000]-5000<=Node.val<=5000 #include<bits/stdc+......
  • 代码随想录算法训练营-动态规划-2|62. 不同路径
    62. 不同路径 1classSolution:2defuniquePaths(self,m:int,n:int)->int:3#创建一个二维列表用于存储唯一路径数4dp=[[0]*nfor_inrange(m)]56#设置第一行和第一列的基本情况7foriinran......