1
2
3
4
5
6
7
8
连通分量标识符 counter =1;
visited[] =false;
for 所有节点 ?:
if(!visited[?])
dfs(?, visited) 或bfs(?, visited)
counter++;
counter 为连通分量数目
图中任意两个点的连通性在某些情况下,我们需要考虑的不仅仅是判断整个图是否为连通这么简单,有时候我们需要考虑,给定两个节点$i, j$,需要判断它们是否相互连接。给定两个点,看它们之间是否连通,可能有很多种情况:比如说当整个图是连通的,则它们必然是连通的;而如果整个图不是连通的,但是这两个点是在一个连通的块,它们也是相互连通的。光遍历一个连通的块是不够的,肯定要遍历完所有的块。另外,如果遍历完一个块仅仅用一个数组来标记是否被访问还是不够的,对于每个不同的连通区域,要进行不同的标识。遍历图中间所有节点所有相通的块必须标识为相同:①遍历一遍所有的节点,对每个节点都调用遍历方法,对于已经访问过的节点则直接跳过;②不管是dfs还是bfs,只要给定一个节点遍历完,这一块连通块我们一路做同样的标记就可以了,只要它们相通那么标记也肯定是一样的实现的细节上考虑用一个计数器和一个数组,对于某个块给计数器设定一个值,然后对应的这个值也放到对应数组的索引的位置里下一次遍历一个新的块时,对这个计数器加一,这样每次遍历的块的计数器值不同。给定任意两个节点,只要判断一下数组里对应的计数器值是否相同就可以判断图中任意两个点是否是连通的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
belongComponent[] = {-1};
counter =1;
visited[] =false;
for 所有节点?:
if(!visited[?])
dfs(?, visited, belongComponent, counter);
counter++;
判断 belongComponent[i] ?= belongComponent[j]
void dfs(star