转载自:Click Here LCA问题(Lowest Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两个顶点u和v的最近公共祖先,即找一个节点,同时是u和v的祖先,并且深度尽可能大(尽可能远离树根)。L ...
分类:
编程语言 时间:
2016-10-14 23:36:45
阅读次数:
258
有关概念: 如果图中两个结点可以相互通达,则称两个结点强连通。 如果有向图G的每两个结点都强连通,称G是一个强连通图。 有向图的极大强连通子图(没有被其他强连通子图包含),称为强连通分量。(这个定义在百科上和别的大神的博客中不太一样,暂且采用百科上的定义) Tarjan算法的功能就是求有向图中的强连 ...
分类:
编程语言 时间:
2016-10-12 16:54:14
阅读次数:
311
题目大意:有n个牛在一块, m条单项绳子, 有m个链接关系, 问有多少个团体内部任意两头牛可以相互可达 解题思路:有向图强连通分量模版图 代码如下: #include<stdio.h> #include<vector> #include<map> #include<set> #include<alg ...
分类:
移动开发 时间:
2016-10-07 13:30:31
阅读次数:
227
题目大意:一个图,要求你加入最少的边,使得最后得到的图为一个边双连通分支。所谓的边双连通分支,即不存在桥的连通分支(题目保证数据中任意两点都联通)。 解题思路:先用tarjan算法进行缩点建立DAG图, 然后再进行寻找度为1的点有个数x, 那么需要添加的边即为(x+1)/ 2; 起初这样写, 一直W ...
分类:
移动开发 时间:
2016-10-07 11:25:18
阅读次数:
285
阅读前请确保自己知道强连通分量是什么,本文不做赘述。 Tarjan算法 一、算法简介 Tarjan算法是一种由Robert Tarjan提出的求有向图强连通分量的时间复杂度为O(n)的算法。 首先我们要知道两个概念:时间戳(DFN),节点能追溯到的最早的栈中节点的时间戳(LOW)。顾名思义,DFN就 ...
分类:
编程语言 时间:
2016-10-05 22:08:59
阅读次数:
226
题目大意:双向联通图, 现在求减少任意一边使图的联通性改变,按照起点从小到大列出所有这样的边 解题思路:双向边模版题 tarjan算法 代码如下: #include<bits/stdc++.h> using namespace std; const int N = 100003; vector<in ...
分类:
其他好文 时间:
2016-10-01 10:32:51
阅读次数:
134
http://acm.hdu.edu.cn/showproblem.php?pid=1269 题意:确定是否是一个强连通图。 思路:裸的tarjan算法。 ...
分类:
其他好文 时间:
2016-09-30 15:18:22
阅读次数:
162
一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法。 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。 定义dfn(u)为节点u搜索的次序编号 ...
分类:
编程语言 时间:
2016-09-25 10:46:16
阅读次数:
352
敲了一道lca的模板题目; 第一次用倍增写的,很好写,没调试几下交了就AC了; 接下来想学习tarjan的离线lca方法; 期间出了一个bug,问题很难找到; 最后我发现是在宏定义那里出了问题,导致地址越界,一直re; 最后交了发现速度和倍增的差不了多少; 难受; ...
分类:
其他好文 时间:
2016-09-23 14:42:52
阅读次数:
147