C# 在可能变化的图中寻找最短路径

C# 在可能变化的图中寻找最短路径,c#,algorithm,graph-algorithm,dijkstra,C#,Algorithm,Graph Algorithm,Dijkstra,我遇到了一个我一直试图用dijkstra算法解决的问题。任务:我们有N个城市,M个“边缘”。每个连接都有一个创建日期和时间。一些路线正在修改,但时间只在减少 例如: 1780年,1,3,50,b//1780年,在50小时内从1到3,b建造,m- 修改 1784年1月2日30日,b 1784,2,3,10,b 1810,1,3,38,m 我正在寻找一个可能在40小时内连接1和3的日期。因此,在1810年修改之前,连接

我遇到了一个我一直试图用dijkstra算法解决的问题。任务:我们有N个城市,M个“边缘”。每个连接都有一个创建日期和时间。一些路线正在修改,但时间只在减少

例如:

1780年,1,3,50,b//1780年,在50小时内从1到3,b建造,m- 修改

1784年1月2日30日,b

1784,2,3,10,b

1810,1,3,38,m

我正在寻找一个可能在40小时内连接1和3的日期。因此,在1810年修改之前,连接<40小时是不存在的。结果是1810


关键是要知道是否有可能在X小时内从A市进入B市。所以我实现了dijkstra的算法——这很好,但每次修改边都会迫使我重新计算所有边。我几乎可以肯定存在更简单的方法。

Dijkstra的算法可以使用来实现,在这种情况下,应该使用它来实现,因为它具有减少键操作,将处理以下内容:

一些路线正在修改,但时间只在减少

一旦理解了最小堆,就知道不需要重新计算所有边,只需在时间O(logn)中执行简单的减少键操作即可

了解了最小堆数据结构后,请转到这里,了解如何使用最小堆实现Dijkstra,之后唯一需要做的额外事情是在成本降低时应用另一个reduce键操作


我建议在开始实施之前仔细阅读这些链接。

您必须尝试每种组合,因此退出点是所有路径都尝试过的时候。必须以最少的时间保存路径。因此,每次转到新节点时,计算时间,然后测试它是否小于当前最小时间。你可以用最短的时间得到两条路径,所以它应该是一个List()对象。@Sumeethin当然,我可以用太宽的理由作为接近的理由,而不是用自定义的理由来解释为什么我认为这个问题还不应该被回答。我不认为这是嘲笑,但你可以有不同的意见。无论如何:假设这符合他们的标准,那么也可以在CS.SE上讨论这个话题。