强连通分量SCC(Tarjan)
什么叫强连通分量呢~
有向图强连通分量在有向图G中,
如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。
如果有向图G的每两个顶点都强连通,称G是一个强连通图。
有向图的极大强连通子图,称为强连通分量(strongly connected components)。
举个例子:
一般来讲,我们选择的都是常数较小的线性算法:Tarjan
实际上,学习过无向图的割点之后,
SCC的tarjan算法更好理解
tarjan ta老人家也是用dfs解决这个问题的
考虑强连通分量C,设其阿红第一个被发现的点为x,
则C中的其他点都是x的后代
我们希望在x访问完成时立即输出C,现在问题的关键就是判断一个点是否是SCC中第一个被发现的点
如图是一棵dfs树
虚线表示一条或多条边
假设我们正在判断u是不是SCC中的第一个点,
如果我们发现从u的子节点出发可以到达u的祖先w,显然u,v,w在一个SCC中
因此u不是第一个发现的结点如果我们发现从v出发最多只能到达u,那么u就是SCC中第一发现的结点
注意
这里的到达,只能通过当前SCC中的点,而不能通过已经确定的SCC中的点
很像无向图割点的low数组
所以我们也可以用类似的方法维护出某一点能够到达的最早祖先
附上一张图
vector<int> G[N],G2[N];
stack<int> S;
int tot,cnt,pre[N],cnt,low[N],scc[N];void dfs(int now)
{pre[now]=low[now]=++tot;S.push(now); //for (int i=0;i<G[now].size;i++){int v=G[now][i];if (!pre[v]) //之前没有访问过{dfs(v);low[now]=min(low[now],low[v]);} else if (!scc[v]) //ta不在之前得到的scc中{low[now]=min(low[now],pre[v]);} }if (low[now]==pre[now]){cnt++;for(;;){int x=S.top(); S.pop();scc[x]=cnt;if (x==now) break;}}
}void find(int n)
{cnt=0; tot=0;S.clear();memset(low,0,sizeof(low));memset(pre,0,sizeof(pre));for (int i=0;i<n;i++)if (!pre[i]) dfs(i);
}
强连通分量SCC(Tarjan)相关推荐
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...
- CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题
题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...
- 有向图强连通分量的Tarjan算法——转自BYVoid
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- [转载] 有向图强连通分量的Tarjan算法 ——byvoid
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大 ...
- 图论——强连通分量(Tarjan算法)
文章目录 强连通分量 利用Tarjan算法求强连通分量 来一道例题练手(USACO08DEC) 图论文章汇总 强连通分量 什么是强连通图? 如果一个有向图中,存在一条回路,所有的结点至少被经过一次,这 ...
- 有向图强连通分量之Tarjan算法
出处https://www.byvoid.com/zhs/blog/scc-tarjan [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...
- 寻找强连通分量的Tarjan算法
有向图的强连通分量 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大 ...
- 有向图强连通分量SCC(全网最好理解)
定义: 在有向图中,如果一些顶点中任意两个顶点都能互相到达(间接或直接),那么这些顶点就构成了一个强连通分量,如果一个顶点没有出度,即它不能到达其他任何顶点,那么该顶点自己就是一个强连通分量. 做题的 ...
最新文章
- JS中集合对象(Array、Map、Set)及类数组对象的使用与对比
- 视音频数据处理入门:AAC音频码流解析
- Vue学习(组件的定义及调用、路由)-学习笔记
- mysql与python交互
- Cannot find module 'less-bundle-promise'
- 微服务开发利器:ELK进行日志采集以及统一处理
- x86平台堆栈优化问题
- smarty手册-smarty中foreach循环语句详解
- 使用IDM下载软件下载百度云网盘里的资源,以Chrome浏览器为例
- C语言习题二:比赛评分系统
- PayPal如何提现,PayPal提现手续费是多少?
- 【CPU设计实战】简单流水线CPU设计
- 中文分词技术--统计分词
- glew库安装和初始化
- 【接口测试基础】第五篇 | 接口用例设计详解
- Oliver的救援【BFS】
- redis安装教程和redis集群搭建--主从复制(读写分离)、中间人模式(主仆兼具、去中心化)、反客为主、哨兵模式,从实战出发的保姆级别教程
- mysql virt虚拟内存_JVM占用VIRT虚拟内存高问题研究
- layui 新手实例教程
- XDMCP远程连接Linux桌面(lightdm) ps -ef |grep lightdm