簡體   English   中英

Haskell - 生成節點之間的所有路徑

[英]Haskell - generating all paths between nodes

我需要構建一個函數,它返回某些節點之間的所有路徑。

connect :: Int -> Int-> [[(Int,Int)]]

Data.Graph庫為我提供了有用的函數'buildG',它為我構建了圖形。 如果我打電話

let g = buildG (1,5) [(1,2),(2,3),(3,4),(4,5),(2,5)]

我將得到一個數組,其中每個節點都映射到他的鄰居。 一個例子:

g!1 = [2]
g!2 = [3,5] 
..
g!5 = []

我試圖使用列表推導來做到這一點,但我在haskell中並不是很好,而且我輸入的錯誤是我無法修復的。

connect x y g 
    | x == y = []
    | otherwise = [(x,z) | z <- (g!x), connect z y g] 

關於周期,我現在不需要擔心。 這是我想要的:

connect 1 5 g = [[(1,2),(2,3),(3,4),(4,5)],[(1,2),(2,5)]]

遞歸思考。 se路徑由s一個邊(s,t)和從te的路徑組成,除非s == e ,在這種情況下路徑應為空。 所以第一次嘗試是

connect x y g
    | x == y    = [[]]
    | otherwise = [(x,t):path | t <- g!x, path <- connect t y g]

從節點到自身的所有合格路徑的列表是具有單個元素[]的列表,在其他情況下,我們通過上面的邏輯獲得所有符合條件的路徑的列表,選擇第一個邊緣並從其末尾找到路徑。

問題是循環會導致它掛起。 為避免這種情況,您必須記住您已訪問過的節點,而不是從中探索的路徑:

connect x y g = helper x y g [x]
  where
    helper a b g visited
        | a == b    = [[]]
        | otherwise = [(a,c):path | c <- g!a, c `notElem` visited, path <- helper c b g (c:visited)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM