双连通分量和强连通分量的总结

【双连通分量】

一、边双连通分量定义

在分量内的任意两个点总可以找到两条边不相同的路径互相到达。总而言之就是一个圈,正着走反着走都可以相互到达,至少只有一个点。

二、点双连通分量的定义

参照上面,唯一的不同:任意两个点可以找到一个点不同的路径互相到达。也是一个圈,正反走都可以,至少为一个点。

三、边、点双连通分量模板代码要注意的地方

边双连通分量:

1.每个节点的所有儿子遍历后才开始计算分量大小,请与点双连通相区分;

2.割顶只能属于一个分量,请与割边区分;(容易搞混)

3.要注意j是否是i的父节点;

点双连通分量:

1.每遍历一个儿子就计算是否有点连通分量;

2.割顶可以属于多个连通分量,请注意与割边区分;

3.当i为根节点时,至少要有两个儿子才能是割点;

【强连通分量】

一、定义

有向图上的环,不啰嗦,与上面两种类似,至少为一个点;

二、模板代码注意的地方

1.每个点所有儿子遍历完才开始求分量;(类似边双连通分量)

2.每个点只能属于一个分量;

【强连通分量和双连通分量常见的模型和问法】

双连通分量

1.给出的图是非连通图,如:

a.有一些点,一些边,加最少的边,要使得整个图变成双联通图。

大致方法:求出所有分量,把每个分量看成一个点,统计每个点的度,有一个度为一则cnt加1,答案为(cnt+1)/2;

b.有一些点,一些边,问最少多少个点单着。

大致方法:求出所有的分量即可,但要注意不同的题可能有特殊要求(如圆桌骑士要求奇圈,要用到二分图判定)

c.各种变式问题

2.给出的图是连通图,如:

a.给定一个起点一个终点,求各种问题是否能实现。

大致方法:求出所有分量,并把每个分量当成点,于是问题得到化简;

b.给一个图,然后有大量的离线回答。

大致方法:求出所有分量,再求出上下子树的信息;

c.各种变式问题;

强连通分量

1.给出的是非连通图,如:

a.有一些点,一些有向边,求至少加多少边使任意两个点可相互到达

大致方法:求出所有的分量,缩点,分别求出出度入度为0的点的数量,取多的为答案;

b.有一些点,一些有向边,求在这个图上走一条路最多可以经过多少个点

大致方法:求出所有的分量,缩点,形成一个或多个DAG图,然后做DAG上的dp

c.有一些点,一些有向边,给出一些特殊点,求终点是特殊点的最长的一条路

大致方法:求出所有分量,并标记哪些分量有特殊点,然后也是DAG的dp

2.给出的是连通图,比较少,有也比较简单

----------------------------------------------------------------

总结:

1.遇到非连通图几乎可以肯定是要求连通分量,不论是无向还是有向图;(可以节约大量思考时间)

2.凡是对边、点的操作,在同一个分量内任意一个点效果相同的,几乎都是缩点解决问题;再粗暴点,几乎求了连通分量都要缩点;

3.一定要考虑特殊情况,如整个图是一个连通分量等(考虑到了就有10-20分);

4.对于双连通分量要分析是边还是点双连通分量;通过题目来判断;

5.拿到题目要先搞清楚给的是连通图还是非连通图。

原文地址:https://www.cnblogs.com/DWVictor/p/11348152.html

时间: 2024-10-11 06:36:09

双连通分量和强连通分量的总结的相关文章

浅谈双连通分量、强连通分量

初谈这个话题相信每一位都会感到一丝疑惑,主要原因是这个词中“分量”一词,当然,如果仅是为了了解和使用这两个术语,就不必在意这个无关大体的词语. 好了,该谈谈正题了,所谓双连通与强连通,最大的差别,也是最本质的差别就是前者适用于无向图中,而后者适用于有向图.至于两者的概念是一样的,就是图中有a点.b点,从a点可到达b点,同时从b点可到达a点.(若是有向图必须延方向到达.) 其中双连通分量可细分为:点-双连通分量,边-双连通分量.所谓点-双连通分量是指在一个无向图中两点间至少有两条路径,且路径中(不

双连通分量(点-双连通分量&边-双连通分量)

概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连通子图称作此无向图的点(边)双连通分量.求双连通分量可用Tarjan算法.--百度百科 Tip:先学一下tarjan算法以及求割点割边的算法之后,再看会比较好理解一些. 点双连通和边双连通 连通的概念:在无向图中,所有点能互相到达 连通分量:互相联通的子图 点双连通:删掉一个点之后,图仍联通 边双连

Kosaraju算法解析: 求解图的强连通分量

1. 定义 连通分量:在无向图中,即为连通子图. 上图中,总共有四个连通分量.顶点A.B.C.D构成了一个连通分量,顶点E构成了一个连通分量,顶点F,G和H,I分别构成了两个连通分量. 强连通分量:有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些顶点成为一个强连通分量. 上图中有三个强连通分量,分别是a.b.e以及f.g和c.d.h. 2. 连通分量的求解方法 对于一个无向图的连通分量,从连通分量的任意一个顶点开始,进行一次DFS,一定能遍历这个连通分量的所有顶点.所以

连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(最近公共祖先)

PS:摘自一不知名的来自大神. 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合. 3.点连通度:最小割点集合中的顶点数. 4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图. 5.割边集合:如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合. 6.边连通度:一个图的边连通度的定义为,最

(转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)

本文转载自:http://hi.baidu.com/lydrainbowcat/item/f8a5ac223e092b52c28d591c 作者提示:在阅读本文之前,请确保您已经理解并掌握了基本的Tarjan算法,不会的请到http://hi.baidu.com/lydrainbowcat/blog/item/42a6862489c98820c89559f3.html阅读.   基本概念:   1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如

小结:双连通分量 & 强连通分量 & 割点 & 割边

概要: 各种dfs时间戳..全是tarjan(或加上他的小伙伴)无限膜拜tarjan orzzzzzzzzz 技巧及注意: 强连通分量是有向图,双连通分量是无向图. 强连通分量找环时的决策和双连通的决策十分相似,但不完全相同. 强连通分量在if(FF[v])后边的else if还要特判是否在栈里,即vis[v],然后才更新LL[u] 割点和强连通分量因为是无向图所以要判个fa,可以在dfs时维护个fa参数 割点如果要求分割的分量,那么就是这个节点对他的子树是割点的数目+1. 割点不需要栈维护但是

Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】

基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合. 3.点连通度:最小割点集合中的顶点数. 4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图. 5.割边集合:如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合. 6.边连通度:一个图的边连通度的定义为,最小割边集合中的边数.

连通分量 无向图的割顶和桥 无向图的双连通分量 有向图的强连通分量

时间戳 dfs_clock :说白了就是记录下访问每个结点的次序.假设我们用 pre 保存,那么如果 pre[u] > pre[v], 那么就可以知道先访问的 v ,后访问的 u . 现在给定一条边, (u, v), 且 u 的祖先为 fa, 如果有 pre[v] < pre[u] && v != fa, 那么 (u, v) 为一条反向边. 1 求连通分量: 相互可达的节点称为一个连通分量: #include <iostream> #include <cstd

DFS的运用(二分图判定、无向图的割顶和桥,双连通分量,有向图的强连通分量)

一.dfs框架: 1 vector<int>G[maxn]; //存图 2 int vis[maxn]; //节点访问标记 3 void dfs(int u) 4 { 5 vis[u] = 1; 6 PREVISIT(u); //访问节点u之前的操作 7 int d = G[u].size(); 8 for(int i = 0; i < d; i++)//枚举每条边 9 { 10 int v = G[u][i]; 11 if(!vis[v])dfs(v); 12 } 13 POSTVIS