Kosaraju】的更多相关文章

给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strongly Connected).如下图中,任意两个顶点都是互相可达的. 对于无向图,判断图是否是强连通的,可以直接使用深度优先搜索(DFS)或广度优先搜索(BFS),从任意一个顶点出发,如果遍历的结果包含所有的顶点,则说明图是强连通的. 而对于有向图,则不能使用 DFS 或 BFS 进行直接遍历来判断.如下图中,…
有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的. 实际上,强连通分支 SCC 将有向图分割为多个内部强连通的子图.如下图中,整个图不是强连通的,但可以被分割成 3 个强连通分支. 通过 Kosaraju 算法,可以在 O(V+E) 运行时间内找到所有的强连通分支.Ko…
一个有向图称为半连通(Semi-Connected),满足:对于图中任两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. 若满足,则称G’是G的一个导出子图. 若G’是G的导出子图,且G’半连通,则称G’为G的半连通子图.若G’是G所有半连通子图中包含节点数最多的,则称G’是G的最大半连通子图. 判断一个图是不是半连通图     求解:<1>Kosarsju算法: [1] 新图DFS    [2] 方法2             <2>Tarjan算法:[1] 新图DFS…
1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组).      算法描叙: :对原图进行深度优先遍历,记录每个顶点的离开时间. :选择具有最晚离开时间的顶点,对反向图进行深度优先遍历,并标记能够遍历到的顶点,这些顶点构成一个强连通分量. ,否则算法结束. 在dfs(bfs)中,一个结点的开始访问时间指的是遍历时首次遇到该结点的时间,而该结点的结束访问时间则指的是将其所有邻接结点…
Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一个事实,逆图(与各边方向相同的图形反转, transpose graph)有相同的强连通分量的原始图. 有关强连通分量的介绍在之前Tarjan 算法中:Tarjan Algorithm 逆图(Tranpose Graph ): 我们对逆图定义如下: GT=(V, ET),ET={(u, v):(v,…
Code[VS] 1332 上白泽慧音题解 Tarjan Algorithm Kosaraju Algorithm 题目传送门:http://codevs.cn/problem/1332/   题目描述 Description 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种…
有向图的强连通分量: 相互可达关系,每一个集合都是有向图的一个强连通分量SCC. 把一个集合看成一个点,SCC就形成了一个有向无环图——DAG;       如果DFS选择不好,从A点开始DFS,就会把整张图遍历一遍.不是同一个SCC就混乱了,我们希望,可以利用SCC的拓扑序列,从后往前DFS,这样,每次都出来一个SCC,就不用分离了——Kosaraju算法. ——拓扑序列 反图——按照拓扑序列从后往前,就可以分离出每个SCC. #include <bits/stdc++.h> using n…
Graph Search and Connectivity Generic Graph Search Goals 1. find everything findable 2. don't explore anything twice Generic Algorithm (given graph G, vertex S) --- initialize S explored (all others unexplored) --- while possible: --- choose an edge(…
- - - - - - - - 一个()打成[] 看了一晚上..... /* 求强连通分量 kosaraju算法 边表存图 正反构造两个图 跑两边 分别记下入栈顺序 和每个强连通分量的具体信息 */ #include<iostream> #include<cstring> #include<cstdio> #include<stack> #define maxn 1010 #define maxx 10010 using namespace std; int…
转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud     Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14778   Accepted: 3911 Description In order to make their sons brave, Jiajia and Wind take t…
Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23445   Accepted: 9605 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M &l…
Kosaraju算法解析: 求解图的强连通分量 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 定义 连通分量:在无向图中,即为连通子图. 上图中,总共有四个连通分量.顶点A.B.C.D构成了一个连通分量,顶点E构成了一个连通分量,顶点F,G和H,I分别构成了两个连通分量. 强连通分量:有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些顶点成为一个强连通分量. 上图中有三个强连通分量,分别是a.b.e以…
Kosaraju算法是干什么的? Kosaraju算法可以计算出一个有向图的强连通分量 什么是强连通分量? 在一个有向图中如果两个结点(结点v与结点w)在同一个环中(等价于v可通过有向路径到达w,w也可以到达v)它们两 个就是强连通的,所有互为强连通的点组成了一个集合,在一幅有向图中这种集合的数量就是这幅图的强连通分量的数量 怎么算?? 第一步:计算出有向图 (G) 的反向图 (G反) 的逆后序排列(代码中有介绍) 第二步:在有向图 (G) 中进行标准的深度优先搜索,按照刚才计算出的逆后序排列顺…
理解   在有向图G中,如果两点互相可达,则称这两个点强连通,如果G中任意两点互相可达,则称G是强连通图. 定理: 1.一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次.             2.非强连通有向图的极大强连通子图,称为强连通分量(SCC即Strongly Connected Componenet). 在上图中,{1,2,3,4}是一个强连通分量,{5},{6}分别是另外两个强连通分量.怎么判断一个图是否是强连通图,如果不是,有哪些强连通分量,又怎么使它成为强…
//P2002解题思路: //先求SCC,缩点后,转换为DAG(有向无环图) //在DAG上统计入度为0的scc数量即可 //Kosaraju时间复杂度:O(N+E) //两次DFS,2N,图的转置E,共2N+E #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=500010; struct…
Kosaraju 这个算法是用来求解图的强连通分量的,这个是图论的一些知识,前段时间没有学,这几天在补坑... 强连通分量: 有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些顶点成为一个强连通分量 如下图所示,a.b.e以及f.g和c.d.h各自构成一个强联通分量 Kosaraju的求解方法 对于一个无向图的连通分量,从连通分量的任意一个顶点开始进行一次DFS,一定是可以遍历这个连通分量的所有定点的.所以,整个图的连通分量数就等价于我们对于这个图找了几次起点(也就是我们…
课本源码部分 第7章  图 - 有向图强连通分量的Kosaraju算法 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑        习题集全解析  链接☛☛☛ <数据结构题集>习题解析合辑        本源码引入的文件  链接☛ OLGraph.c       文档中源码及测试数据存放目…
http://acm.hdu.edu.cn/showproblem.php?pid=2767 问最少添加几条边使得图为强连通. tarjan跑一下,然后对强连通分量缩点,找下此时出度为零和入度为零的点数输出较大者即可. tarjan,dfn数组也同时起到了标记的作用,如果未标记说明此时的边就是dfs树上的边,否则的话,如果v已经处于某个scc中说明这条边是交叉边,不用考虑(因为一定无对应的回边,有的话这个点就应该和v属于同一个scc,与过程矛盾).否则就是回边了,和求桥和割点的方法类似求dfn以…
不会Tarjan,难道就不能与邪恶的SCC作斗争了吗? 祭出Kosaraju. 一些变量名的意义: a[N] 原图的vector存储 b[N] 原图的所有边反向vector存储 s dfs得出的拓扑序列栈 c[[N] 每个点的SCC编号 算法框架: 1.将原图做一遍类似于拓扑的dfs,越早访问的顶点压在一个栈中. 2.不断从栈顶取出一个未访问过的点,对它的反向图再进行dfs,所有它能到达的未访问过的点就是他的SCC. 3.这样就得到的一个图的SCC. 对于2的正确性,应为这个点必被在栈中比它早入…
一.背景介绍 强连通分量是有向图中的一个子图,在该子图中,所有的节点都可以沿着某条路径访问其他节点.强连通性是一种非常重要的等价抽象,因为它满足 自反性:顶点V和它本身是强连通的 对称性:如果顶点V和顶点W是强连通的,那么顶点W和顶点V也是强连通的 传递性:如果V和W是强连通的,W和X是强连通的,那么V和X也是强连通的 强连通性可以用来描述一系列属性,如自然界中物种之间的捕食关系,互相捕食的物种可以看作等价的,在自然界能量传递中处于同一位置. 下图中,子图{1,2,3,4}为一个强连通分量,因为…
Kosaraju 算法学习 序 这星期捣鼓了一个新的算法--Kosaraju算法 今天分享给大家 简介 Kosaraju算法,其实与tarjan算法差不多.但是码量较小,容易记忆.其时间复杂度与tarjan算法一样,为O(n+m),所以,某种程度上来说Kosaraju可以替代tarjan算法. 算法思路 如果直接让我讲Kosaraju算法到底是基于什么实现的,我肯定讲不出来,但只能知道它的基本思路--dfs两次. 就是这么简单,当然,为什么广大的oier不学习Kosaraju算法呢?因为麻烦.…
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components). 下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达.{5},{6}也分别是两个强连通分量. 直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M).更好的…
有向图中,连通性比较好理解,如果两个顶点V和顶点W是可达的,可以称之为强连通的,即存在路径A→B,同时也存在一条有向路径B→A.从之前的有向环的判定过程中其实我们可以得到一个结论就是两个是强连通的当且仅当它们都在一个普通的有向环中.强连通将所有的顶点分为了不同的集合,每个集合都是由相互均为强连通性的顶点的最大子集组成的,我们将这些集合称之为强连通分量. 基础概念 一般来说技术服务于生活,如果将我们看到网页作为顶点,页面指向另外一个页面的超链接作为边,可以将数量庞大的网页分为不同的大小进行处理,作…
http://acm.hdu.edu.cn/showproblem.php?pid=6072 题意: 给你$n*n$的矩阵,每次修改k条边,让你计算其中能相互到达的点对有多少. 思路: 其实就是求强连通分量,如果一个强连通分量里有n个点,那么这里面的点对就有$n*(n-1)/2$.用Kosaraju计算即可,但是这样是会超时的,还需要用bitset来优化. __builtin_函数中处理二进制位的函数: int __builtin_ffs (unsigned x) 返回x中最后一个1是从右往左第…
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你…
求有向图的强连通分量     Kosaraju算法可以求出有向图中的强连通分量个数,并且对分属于不同强连通分量的点进行标记. (1) 第一次对图G进行DFS遍历,并在遍历过程中,记录每一个点的退出顺序.以下图为例: G图 结点第二次被访问即为退出之时,那么我们可以得到结点的退出顺序 (2)倒转每一条边的方向,构造出一个反图G’.然后按照退出顺序的逆序对反图进行第二次DFS遍历.我们按1.4.2.3.5的逆序第二次DFS遍历: G`图   访问过程如下: 每次遍历得到的那些点即属于同一个强连通分量…
题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为牛C是红人,那么牛A也认为牛C是红人.求被其他所有牛认为是红牛的牛的总数. 解题思路:把所有牛看成顶点,把有序对(A,B)看成从A到B的有向边,那么题目就变成了求所有顶点都可到达的顶点的总数.我们可以得到一个结论,如果一个强连通分量里有一头牛被认为是红人,那么该强联通分量里的所有牛都是红人,这显然是…
http://poj.org/problem?id=2186 题意: 一个有向图,求出点的个数(任意点可达). 思路: Kosaraju算法的第一次dfs是后序遍历,而第二次遍历时遍历它的反向图,从标号最大的结点开始遍历. 对于这道题,在求解强连通分量之后,能被所有点可达只可能是最后一个强连通块,根据遍历时的拓扑序,我们可以计算出最后一个的结点个数. 但是我们最后还是要判断一下,这个连通块是不是任意结点可达. #include<iostream> #include<algorithm&g…
在了解kosaraju算法之前我们先了解一下什么是强连通分量,在有向图中如果两个定点vi,ui存在一条路劲从vi到达ui且也存在一条路劲从ui到达vi那么由ui和vi这两个点构成的图成为强连通图,简洁一点就是存在两个或两个点以它们之间可以相互可达由这些点构成的图就称之为强连通图它们的存在形式可以如下 当然一个点也是一个强连通分量,它们都满足所有点之间都可以互相可达. 以上就是对强连通分量的介绍接下来对kosaraju算法思路进行分析. 我们将对下面这个图进行对kosaraju算法进行解析: 我们…
什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达,那么我们说s与t是强连通的.那么在有向图中,由互相强连通的顶点构成的分量,称作强连通分量. 一:对于kosaraju算法,这是一个比tarjan较复杂的算法,但是因为一本通上介绍了这种算法,我就找几个题目练习了一下. kosaraju算法:可以求出强连通分量的个数,还可以对分属于不同强连通分量的点进行标记. 算法描述:(1):…