2013-05-26 80 views
0

我有一個代表有向圖的字典。例如...Python:廣度優先搜索能夠返回最大距離嗎?

​​3210

這意味着「富」節點指向「你好」「棧」「酒吧」節點指向「上方」'流'

我也寫代碼,首先進行廣度搜索,查找任何兩個節點之間的最短路徑 ...

from collections import deque 

def breadthFirstSearch(graph, start, end): 
    q = deque() 
    path = (start,) 
    q.append(path) 
    visited = set([start]) 
    while q: 
     path = q.popleft() 
     last_node = path[-1] 
     if last_node == end: 
      return path 
     for node in graph[last_node]: 
      if node not in visited: 
       visited.add(node) 
       q.append(path + (node,)) 
    print 'There is no path from ' + start + ' to ' + end + '.' 
    return None 

我的問題是:是否有可能修改該廣度優先搜索等等因爲它給了我最大的最短路徑以及該路徑的開始和結束節點?

回答

1

你的問題叫做「圖形直徑問題」。

廣度優先搜索創建廣度優先搜索樹。由於非樹邊緣的存在,兩個節點之間最長的樹通常會比它們之間的最長路徑長。所以不,你不能讓BFS直接做到這一點。

BFS會將它釘在樹上,但它略顯不平凡。

有一個名爲「字典寬度優先搜索」的變體,可以找到某些受限類圖的直徑。那些我在LBFS中運行的圖類往往看起來很像樹。

編輯:當然,您可以從每個節點開始運行BFS,並計算出BFS報告的最長路徑。或者你可以使用非常優雅的Floyd-Warshall algorithm

+0

感謝您的回覆,我正在考慮只是首先搜索每個可能的節點組合並選擇最長的加長路徑。但是我有100000多個節點,它需要很長時間才能運行。反正可以更快地運行這個強力方法嗎? – Ogen

+0

你的圖有多密?它有什麼特殊的結構嗎?嘿,你的圖是什麼? – tmyklebu

+0

我的圖形如上所述。它只是一個字典,其中每個密鑰都是一個節點,其值是該節點連接的節點。它由大約100000多個節點組成。 (它也是一個有向圖) – Ogen