LCA的Tarjan算法是一个离线算法,复杂度$O(n+q)$。 我们知道Dfs搜索树时会形成一个搜索栈。搜索栈顶节点cur时,对于另外一个节点v,它们的LCA便是v到根节点的路径与搜索栈开始分叉的那个节点lca。而站在cur上枚举v找lca的过程可以用并查集优化到$O(\log n)$级别。 并查 ...
分类:
其他好文 时间:
2018-09-22 18:21:03
阅读次数:
175
这里给出一个dalao炒鸡详细的解释: https://www.cnblogs.com/stxy-ferryman/p/7779347.html#4073877 Tarjan算法 void Tarjan(int u) { dfn[u]=low[u]=++num; st[++top]=u;//入栈 v ...
分类:
其他好文 时间:
2018-09-21 21:14:58
阅读次数:
290
先简单叙述一下tarjan算法的执行过程(其他诸如伪代码之类的相关细节可以自己网上搜索,这里就不重复贴出了): 用到两类数组: dfs[]:DFS过程中给定节点的深度优先数,即该节点在DFS中被访问的次序 low[]:从给定节点回溯时,节点的low值为从节点在DFS树中的子树中的节点可以回溯到的栈中 ...
分类:
编程语言 时间:
2018-09-16 19:47:16
阅读次数:
169
首先我们需要知道强连通分量,因为Tarjan就是用来求这个的。连通的意思是对于<u,v>,存在路径可以从其中一个达到另一个;强连通是指即存在从u到v的路径,又存在从v到u的路径。强连通是针对于有向图来说的,因为无向图只要做到了连通就做到了强连通。强连通分量就是指有向图的极大强连通子图,多一个点少一个 ...
分类:
编程语言 时间:
2018-09-15 20:48:17
阅读次数:
224
这是LCA算法中的一种,Tarjan算法 其实这么说也有点不对,应该是Tarjan+DFS进行解决 LCA又称为最近公共祖先 那么什么是最近公共祖先: 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点 而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点。 换句话说,最近公共祖先就是 ...
分类:
其他好文 时间:
2018-09-06 02:35:15
阅读次数:
126
http://codeforces.com/problemset/problem/999/E 题意 有向图 给你n个点,m条边,以及一个初始点s,问你至少还需要增加多少条边,使得初始点s与剩下其他的所有点都连通。 第一个想法自然是通过上标记的方法,对每一个入度为0的点跑dfs。 但是问题在于剩下没有 ...
分类:
其他好文 时间:
2018-09-06 00:10:03
阅读次数:
152
Tarjan算法 应用: 有向图的强连通分量 无向图割点和桥 双连通分量 接下来主要谈论前面两者的应用(~~主要是第三种还没学会~~) 算法简要介绍 我们需要先理解一下知识:搜索树 有向图的搜索树的4种边,如下图所示: tree edge:在dfs搜索u的过程中,第一次搜索v,则(u,v)是树边 f ...
分类:
其他好文 时间:
2018-09-03 00:06:11
阅读次数:
213
Tarjan算法 消息的传递 描述: 我们的郭嘉大大在曹操这过得逍遥自在,但是有一天曹操给了他一个任务,在建邺城内有N(<=1000)个袁绍的奸细,将他们从1到N进行编号,同时他们之间存在一种传递关系,即若C[i,j]=1,则奸细i能将消息直接传递给奸细j。现在曹操要发布一个假消息,需要传达给所有奸 ...
分类:
编程语言 时间:
2018-08-30 13:44:22
阅读次数:
255
int dfn[16]; // 时间戳 int dfn_num = 0; // 时间 int low[16]; // 节点u所能访问到的最小时间戳 int inSt[16]; // 节点u是否在栈中. int st[16]; int top = 0; // 我们维护的信息. int col[16];... ...
分类:
编程语言 时间:
2018-08-29 16:05:44
阅读次数:
153
Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a list ...
分类:
编程语言 时间:
2018-08-22 21:54:38
阅读次数:
199