考虑强连通分量C,设其中第一个被发现的点为x,则,C中其他的点都是x的后代。我们希望在x访问完成时立即输出C(可以同时记录C,输出代表当前在当前的遍历序列中剔除),这样就可以在同一颗DFS树种区分开所有SCC了,因此问题的关键是判断一个点是否为一个SCC中最先被发现的点。...
分类:
编程语言 时间:
2016-05-12 23:54:53
阅读次数:
354
转自:https://www.byvoid.com/blog/scc-tarjan/
Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。
定义DFN(u)为节点u搜索的次序编号(时间戳),Low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号((这个...
分类:
编程语言 时间:
2016-05-12 22:16:20
阅读次数:
213
tarjan缩点模板 现在才学是不是太晚了= = ...
分类:
其他好文 时间:
2016-05-10 18:03:43
阅读次数:
151
题意:投票,投票可以传递,当一个人投票时,要把此人的得票数全给被投的那个人,问最后按升序输出得票数最高的人。
想法:显然在一个连通块内的所有点的得票数都是一样的,即:块内点数-1,(1:是他自己本身)。所以先要tarjan缩点,然后求出每一个块可以由几个块到达(这里可以反向建边dfs)。最后输出最大得票数的人即可。
#include
#include
#include
#inc...
分类:
其他好文 时间:
2016-05-07 11:12:46
阅读次数:
163
大意:给定一些有向图间的关系问任意两点是不是可达的。
思路:Tarjan后直接看入度和出度为0的数量关系,如果大于1则肯定是不可能,相连通的。
#include
#include
#include
#include
#include
#include
#include
#include
#define LL int
#define inf 0x3f3f3f3f
#define ...
分类:
其他好文 时间:
2016-05-07 09:12:13
阅读次数:
242
题意:n个城市,m条有向边, 现在要把这个图分成块,对于块的定义:1,所有能够互通的点一定在一个块内。2,一个点可以到达另一个点,所经过的点只能是这个块内的。问做少要分多少个块?
想法:显然tarjan先缩点,然后可以想到,要想百分之一百满足第2个条件,那么每一个块最多只能有所点后的两个点,所以对所得的缩点进行二分匹配,然后求得最大独立集=col-(最大匹配数)
#includ...
分类:
其他好文 时间:
2016-05-07 07:23:08
阅读次数:
172
具体思路见详解网址:https://www.byvoid.com/blog/scc-tarjan;
然后整理出了这个tarjan模板,具体数组的功能代码都有注释。
const int N=100010;
struct data
{
int to,next;
} tu[N*2];
int head[N];
int ip;
int dfn[N], low[N];///dfn[]表示深搜的步...
分类:
其他好文 时间:
2016-05-06 16:11:15
阅读次数:
99
链接: How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11204 Accepted Submission(s): ...
分类:
编程语言 时间:
2016-05-03 16:17:39
阅读次数:
207
动态规划. 首先,如果一个强连通分量的一个点在子图里,这个强连通分量所有点都在子图。所以先用tarjan算法求出强连通分量,缩点,当成一个点来处理。然后进行俩次动态规划就行了,注意判重边。 #include #include #include #include using namespace std... ...
分类:
其他好文 时间:
2016-05-01 16:14:20
阅读次数:
224
想了半天决定第一篇就发一道水题的题解吧……这道题以前就看了但是神奇的第一次没有写对,然后今天写代码+调试,额……二十分钟…… 题目懒得贴了,直接戳这里 题目大意就是给你一个图(毫无疑问稀疏图),然后每一次抹去其中一个节点,然后求这时的连通块个数。 第一次看这题的时候在学tarjan,第一反应就是每次 ...
分类:
Web程序 时间:
2016-05-01 06:23:19
阅读次数:
260