我正在研究一些图形算法(这不是功课;我只是在研究算法和数据结构),我有一个问题。假设我有以下无向图:
var graph = {
9: [19, 26],
13: [19, 5],
17: [],
26: [11, 18],
18: [9],
19: [],
23: [24],
24: [],
11: [],
18: []
};
图表基本上如下所示:
此图表中有多少个连接组件?从图中看,它看起来有3个组件。但是,如果我实际实现了算法(迭代每个顶点,并使用该顶点作为起点进行bfs 如果该顶点未被发现。此外,bfs将标记它遇到的任何顶点,如发现的那样)。
如果我从9
开始,我最终会发现以下节点:[19, 26, 11, 18]
。但是,13
未被发现,因为它不在19
的邻接列表中。但是,19
位于13
的邻接列表中。这就是我最终得到一个额外组件的原因。
这是对的吗?实际上是否有4个单独的组件,如果是这样,我对连接组件的理解是错误的吗?
答案 0 :(得分:4)
问题在于,对于无向图表的邻接列表表示,您必须
(1)使用对称邻接列表,即在设置新边ab
时,将b
添加到adjlist[a]
和反之亦然
或
(2)遍历所有顶点的邻接列表,只要你正在寻找边缘的存在。
由于(2)非常低效,你通常会选择(1)。这也是一般使用的adj列表的惯例。如果我被提交了你的调整清单,我会认为该图是有针对性的。
答案 1 :(得分:3)
您可以更改邻接列表表示,您的表示是“定向”但您的图片是无向的。对于边(a,b)图{a:[b],b:[a]}