簡體   English   中英

使用SQL的圖形中的最長路徑

[英]Longest path in graph using SQL

我有一個圖形,該圖形另存為兩個表,名稱分別為Edge和Node,如下所示:

Node table:
Id Name
10 A
11 B
12 C

Edge Table:
From To Weight
10 11 0.3
10 14 0.2
10 12 0.5
11 12 0.6
12 10 0.8

例如,從節點10到節點12的路徑的一種可能解決方案如下:

From    To  Weight  Path
10  12  0.9 10,11,12

現在,我想找出圖的節點之間的最長路徑(對於任何可能的路徑)。

我更改了帶有負邊緣的dijkstra,它循環播放並且不返回任何結果。

是否有任何程序或算法可以找出所需的結果?

最近,我遇到了類似的問題,並嘗試使用SQL遞歸CTE查詢找到最長的路徑 請參考給定的文章。

我嘗試為您的問題修改上述解決方案,並獲得所有可能路徑的列表,如以下輸出屏幕所示

在此處輸入圖片說明

如果這是您要達到的結果,我可以繼續在SQL Server上描述我的解決方案

引用的SQL查詢計算給定兩個節點的最長路徑。 因此,首先我們需要定義所有可能的起始節點和目標節點

以下查詢列出了所有可能的組合

select Nodes_From.Id as [From], Nodes_To.Id as [To]
from LongestPath_Nodes as Nodes_From
inner join LongestPath_Nodes as Nodes_To
    on Nodes_From.Id <> Nodes_To.Id

請注意,例如,這不包括“ 14”,因為它不在節點表中(因此實際上在給定的測試數據中存在一致性問題)

因此,通過創建一個SQL游標 ,我可以遍歷每個節點集(從到節點的組合)並執行存儲過程,該存儲過程包括SQL代碼,該代碼計算了引用文章中給定的兩個節點的最長路徑

我還創建了一個表來存儲路徑的總重量

Create Table LongestPath_Routes ([weight] decimal(10,1), path varchar(100))

如下面的SQL腳本所示,我一開始就清除了該表。 然后針對存儲過程中每個從頭到尾的節點填充該表。最后,在游標執行完成后,我根據權重列對表進行查詢,以查詢最長的路徑(也可以查詢最短的路徑)

truncate table LongestPath_Routes

DECLARE @From TinyInt
DECLARE @To TinyInt

DECLARE PathCursor CURSOR FAST_FORWARD FOR
    select Nodes_From.Id as [From], Nodes_To.Id as [To]
    from LongestPath_Nodes as Nodes_From
    inner join LongestPath_Nodes as Nodes_To
        on Nodes_From.Id <> Nodes_To.Id

OPEN PathCursor

FETCH NEXT FROM PathCursor INTO @From, @To

WHILE @@FETCH_STATUS = 0
BEGIN
set nocount on
 EXEC LongestPath_Calculate_for_Nodes @From, @To
set nocount off

 FETCH NEXT FROM PathCursor INTO @From, @To
END

CLOSE PathCursor
DEALLOCATE PathCursor 

select * from LongestPath_Routes order by [weight] desc

我希望這個解決方案對您有幫助

暫無
暫無

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

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