如果图不是邻接矩阵,如何找到节点的所有邻居?

时间:2018-09-04 20:39:42

标签: c graph-theory breadth-first-search

我试图用C谷歌搜索BFS实现,但是它们似乎都希望以邻接矩阵的形式出现,并且据我所知,它可以立即发现所有相邻节点。

  1. 但是如果输入是成对的节点,我应该怎么做才能找出相邻的节点?
  2. 每次寻找邻居时,我都应该存储这些边缘并在它们之间循环吗?但这听起来很慢,就像我这样的假人会做的:(。
  3. 还是我应该以某种方式将输入转换为邻接矩阵?

输入示例

{
    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/

1 个答案:

答案 0 :(得分:1)

  

我试图用C谷歌搜索BFS实现,但是它们似乎都希望以邻接矩阵的形式出现,并且据我所知,它可以立即发现所有相邻节点。

嗯,不。邻接矩阵使您可以在非零时间量内找到相邻节点的 set ,该时间与节点数无关。但是,仍然需要与节点数成比例的时间来确定该集合的所有元素是什么。其他表示形式,例如邻接 list ,可以允许在相同的恒定时间内找到该集合,并按与它们的数量成比例的时间找到其元素(该元素的数量可能远小于节点总数)

  
      
  1. 但是如果输入是成对的节点,我应该怎么做才能找出相邻的节点?
  2.   

如何建立邻接矩阵或邻接列表或替代表示形式,然后使用它?

  
      
  1. 每次寻找邻居时,我都应该存储这些边缘并在它们之间循环吗?但这听起来很慢,就像我这样的假人会做的:(。
  2.   

平坦的边缘列表是一种可能的表示。您可以通过多种方法使这样的列表更有效地使用(例如,通过对其进行排序和/或对其进行索引),但是,这是否真的要赢则取决于问题。

  
      
  1. 还是我应该以某种方式将输入转换为邻接矩阵?
  2.   

如果确实要创建一个邻接矩阵,则首先创建一个代表所有节点且没有边的矩阵。阅读边缘列表,并为其中的每个边缘填写适当的条目,如果图形是无向的,则填写适当的两个条目。