Tarjan&LCA题集【夏天的风】

本文深入探讨了信息技术领域的核心概念,包括但不限于强连通、双连通、LCA等图论概念及其在不同场景的应用,同时涉及了前端开发、后端开发、移动开发等多个细分技术领域。通过具体实例解析,旨在帮助读者理解和掌握这些技术的核心思想与实践方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【HDU】
[强连通]:
1269  迷宫城堡 判断是否是一个强连通★
2767Proving Equivalences  至少加几条边让整个图变成强连通★
3836 Equivalent Sets  至少加几条边让整个图变成强连通★
1827    Summer Holiday  传递的最小费用★★
3072    Intelligence System  传递的最小费用★★
3861The King’s Problem 强连通+二分匹配★★
3639Hawk-and-Chicken  强连通缩点 + 树形dp(累加子节点的总权值)★★
3594 Cactus 仙人掌图★★★

[双连通]:
2242考研路茫茫——空调教室  双联通缩点+树形DP
2460Network 边双连通
3849By Recognizing These Guys, We Find Social Networks Useful  双连通求桥
3896Greatest TC  双连通
4005 The war  边双连通
3394Railway 双连通求块

[LCA]:
2586How far away ?
2874Connections between cities
3078Network  LCA+排序
3830Checkers  二分+LCA
4338 Simple Path [点连通缩块+LCA]

==========================================================================================
【POJ】
[强连通]:
1236Network of Schools
2553 The Bottom of a Graph  好题! 找出度为0的集合
2186    Popular Cows  好题! 找出度为0的,其他分量都指向它的集合
2375Cow Ski Area 强连通
2762    Going from u to v or from v to u?  缩点+拓扑排序
3160   Father Christmas flymouse  强连通+最短路
3180 The Cow Prom  判断有几个环, 分量中元素大于1的个数
3114Countries in War  强连通+最短路
3592Instantaneous Transference  强连通分量+最长路
1904King's Quest  强连通+并查集


[双连通]:
3694 Network  边双连通 (同hdu2460)
3177 Redundant Paths   构造边双连通
3352 Road Construction   构造边双连通
2942 Knights of the Round Table  (点双连通经典题)
1515 Street Directions  (无向图改有向图)
1438 One-way Traffic   (混合图改有向图)


[LCA]:
1330Nearest Common Ancestors
1470Closest Common Ancestors
1986Distance Queries
3417Network
3728The merchant  LCA+RMQ(倍增法)
2763Housewife Wind  LCA+线段树(树链剖分)
1523SPF
1144Network
2117Electricity
3237Tree


==========================================================================================
【其他OJ】
zoj 2682 People like People
foj 1719 Spy Network
http://www.spoj.pl/problems/QTREE2/  LCA查找路径第k个点
==========================================================================================
### 使用 Tarjan 算法求解最近公共祖先(LCA) #### 定义与特性 Tarjan 算法属于离线算法的一种,在一次遍历中可以解决所有询问,因此具有 \(O(n+q)\) 的时间复杂度[^1]。该算法适用于树结构中的多个节点对之间的 LCA 查询。 #### 实现原理 Tarjian 算法的核心在于利用深度优先搜索(DFS)和并查的数据结构来高效地找到两个节点的最低共同祖先。具体来说: - 对于每一个节点 u 和它的子节点 v 进行 DFS 访问; - 当访问到某个节点时,将其加入当前路径合 S 中,并标记为已访问状态; - 如果遇到一个已经被访问过的节点,则说明找到了回路,此时可以通过查找并查中代表元的方式确定这些节点间的 LCA 关系; - 处理完所有的边之后再撤销本次操作的影响以便后续其他分支继续执行相同逻辑; #### Python 代码实现 下面是一个基于上述思路编写的Python版本的Tarjan算法实现: ```python from collections import defaultdict, deque class UnionFind(object): def __init__(self, n): self.parent = list(range(n)) def find(self, p): if self.parent[p] != p: self.parent[p] = self.find(self.parent[p]) return self.parent[p] def union(self, p, q): rootP = self.find(p) rootQ = self.find(q) if rootP == rootQ: return self.parent[rootP] = rootQ def tarjan_lca(edges, queries): graph = defaultdict(list) for u, v in edges: graph[u].append(v) graph[v].append(u) uf = UnionFind(len(graph)) result = {} visited = set() query_dict = {tuple(sorted([u,v])) : idx for idx,(u,v) in enumerate(queries)} def dfs(node,parent=None): nonlocal result,visited,query_dict stack = [(node,False)] while stack: node,is_backtracked=stack.pop() if not is_backtracted: visited.add(node) # Process all adjacent nodes except parent. children=[child for child in graph[node]if child!=parent] stack.append((node,True)) for next_node in reversed(children): if next_node not in visited: stack.extend([(next_node,False)]) continue # Backtracking phase starts here. for other_node,lca_index in ((other_node,idx)for (a,b),idx in query_dict.items()if a==node or b==node): if other_node in visited: lca=min(other_node,node,key=lambda x:uf.find(x)) result[lca_index]=lca uf.union(parent,node) start_node = min(graph.keys()) dfs(start_node) output = [-1]*len(query_dict) for i,j in result.items(): output[i]=j return output ``` 此函数接收图表示形式 `edges` 及查询列表 `queries` 参数作为输入参数,并返回对应每一对顶点之间最小公祖节点的结果数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值