什么叫强连通分量呢~

有向图强连通分量在有向图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)相关推荐

  1. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  2. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  3. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  4. 有向图强连通分量的Tarjan算法——转自BYVoid

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  5. [转载] 有向图强连通分量的Tarjan算法 ——byvoid

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  6. 有向图强连通分量的Tarjan算法

    有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大 ...

  7. 图论——强连通分量(Tarjan算法)

    文章目录 强连通分量 利用Tarjan算法求强连通分量 来一道例题练手(USACO08DEC) 图论文章汇总 强连通分量 什么是强连通图? 如果一个有向图中,存在一条回路,所有的结点至少被经过一次,这 ...

  8. 有向图强连通分量之Tarjan算法

    出处https://www.byvoid.com/zhs/blog/scc-tarjan [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...

  9. 寻找强连通分量的Tarjan算法

    有向图的强连通分量 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大 ...

  10. 有向图强连通分量SCC(全网最好理解)

    定义: 在有向图中,如果一些顶点中任意两个顶点都能互相到达(间接或直接),那么这些顶点就构成了一个强连通分量,如果一个顶点没有出度,即它不能到达其他任何顶点,那么该顶点自己就是一个强连通分量. 做题的 ...

最新文章

  1. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比
  2. 视音频数据处理入门:AAC音频码流解析
  3. Vue学习(组件的定义及调用、路由)-学习笔记
  4. mysql与python交互
  5. Cannot find module 'less-bundle-promise'
  6. 微服务开发利器:ELK进行日志采集以及统一处理
  7. x86平台堆栈优化问题
  8. smarty手册-smarty中foreach循环语句详解
  9. 使用IDM下载软件下载百度云网盘里的资源,以Chrome浏览器为例
  10. C语言习题二:比赛评分系统
  11. PayPal如何提现,PayPal提现手续费是多少?
  12. 【CPU设计实战】简单流水线CPU设计
  13. 中文分词技术--统计分词
  14. glew库安装和初始化
  15. 【接口测试基础】第五篇 | 接口用例设计详解
  16. Oliver的救援【BFS】
  17. redis安装教程和redis集群搭建--主从复制(读写分离)、中间人模式(主仆兼具、去中心化)、反客为主、哨兵模式,从实战出发的保姆级别教程
  18. mysql virt虚拟内存_JVM占用VIRT虚拟内存高问题研究
  19. layui 新手实例教程
  20. XDMCP远程连接Linux桌面(lightdm) ps -ef |grep lightdm

热门文章

  1. 前端基础-html-01
  2. Web爬虫|入门实战之实习僧(编码反爬)
  3. 微信小程序自定义yPicker组件分析及省市区三级联动实现
  4. 魔性计时器html,PDD西卡脸抽不断 拜年秀播出倒计时1天
  5. T检验三种方法的区分
  6. SpringCloud接入Nacos作为「注册中心」和「配置中心」
  7. 一文获取36个Python开源项目,平均Star 1667,精选自5000个项目
  8. PMI是什么参数在LTE中??和RI,CQI怎么作用的??
  9. html页面跳转闪屏,闪屏页.html
  10. 金蝶迷你版所有数据引出excel没有反应,如何处理