我试图用C谷歌搜索BFS实现,但是它们似乎都希望以邻接矩阵的形式出现,并且据我所知,它可以立即发现所有相邻节点。
输入示例
{
Nodes:
0
1
2
3
Edges:
0 2
1 3
2 3
0 1
}
密码
BFS (G, s) //Where G is the graph and s is the source node
let Q be queue.
Q.enqueue( s )
mark s as visited.
while ( Q is not empty)
v = Q.dequeue( )
for all neighbours w of v in Graph G /* <---------------------------------------- HOW? */
if w is not visited
Q.enqueue( w )
mark w as visited.
来自https://www.hackerearth.com/practice/algorithms/graphs/breadth-first-search/tutorial/
答案 0 :(得分:1)
我试图用C谷歌搜索BFS实现,但是它们似乎都希望以邻接矩阵的形式出现,并且据我所知,它可以立即发现所有相邻节点。
嗯,不。邻接矩阵使您可以在非零时间量内找到相邻节点的 set ,该时间与节点数无关。但是,仍然需要与节点数成比例的时间来确定该集合的所有元素是什么。其他表示形式,例如邻接 list ,可以允许在相同的恒定时间内找到该集合,并按与它们的数量成比例的时间找到其元素(该元素的数量可能远小于节点总数)
- 但是如果输入是成对的节点,我应该怎么做才能找出相邻的节点?
如何建立邻接矩阵或邻接列表或替代表示形式,然后使用它?
- 每次寻找邻居时,我都应该存储这些边缘并在它们之间循环吗?但这听起来很慢,就像我这样的假人会做的:(。
平坦的边缘列表是一种可能的表示。您可以通过多种方法使这样的列表更有效地使用(例如,通过对其进行排序和/或对其进行索引),但是,这是否真的要赢则取决于问题。
- 还是我应该以某种方式将输入转换为邻接矩阵?
如果确实要创建一个邻接矩阵,则首先创建一个代表所有节点且没有边的矩阵。阅读边缘列表,并为其中的每个边缘填写适当的条目,如果图形是无向的,则填写适当的两个条目。