我在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并且它循环并且没有返回任何结果。
是否有任何程序或算法可以找到所需的结果?
答案 0 :(得分:0)
最近我遇到了类似的问题并试图find the longest path using SQL recursive CTE query。请参阅给定的文章。
我尝试针对您的问题修改上述解决方案,并获取所有可能路径的列表,如以下输出屏幕所示
如果这是您想要获得的结果,我可以继续在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 cursor,我可以遍历每个节点集(从 - 节点组合)并执行存储过程,其中包括计算给定两个节点的最长路径的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
我希望这个解决方案可以帮助你