使用BFS查找图表的直径

时间:2016-10-16 03:58:13

标签: graph-theory breadth-first-search

Algo找到图的直径如下:

  1. 在任何arbirtray顶点上运行BFS并记住最后访问的节点(比如说t)
  2. 从t运行BFS并记住最后访问的节点(比如t')
  3. t和t'之间的最短距离将是图表的直径。
  4. 这是我学到的东西,它工作正常,直到我找到以下图表:

    A------G-----C------D  
    |  
    E------F------B
    

    如果我从A运行BFS,我会AGECF"DB"...,而B的BFS会BFCEDGA....so d(B,A)=3应该是直径。

    但是,如果我从A运行BFS作为AGECF"BD",而不是从D运行BFS,而DCBGFAE,则d(D,E) = 4应为直径

    出了什么问题?这个算法不总是有效吗?

2 个答案:

答案 0 :(得分:2)

只有在想要找到非循环树的直径时,您的算法才有效。如果要查找图表的直径,可以使用Floyd-Warshall的所有对最短路径算法。然后遍历整个距离矩阵,你可以找到图的直径。

答案 1 :(得分:1)

不幸的是,您的算法不正确。看看这里的讨论:

https://cs.stackexchange.com/questions/194/the-time-complexity-of-finding-the-diameter-of-a-graph

一般来说,如果你想保证图形的直径,你需要从每个状态做一个BFS(加权图中的Dijkstra),然后在所有搜索中取最大值。 (或计算所有对最短路径信息,并从该数据中找出最长的最短路径。)

如果您在有向树或其他特殊情况下,您可以做得更好。