[英]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.