C++ 如何将图的一部分压缩成一个节点,并能找到从一个节点到所有节点的最短路径?

C++ 如何将图的一部分压缩成一个节点,并能找到从一个节点到所有节点的最短路径?,c++,c,algorithm,graph,C++,C,Algorithm,Graph,我有一个图形,具有以下功能- 具有总计N个节点(1,2…N) 所有边都是双向的 从1到K的节点(K让我们使用标准的Dijkstra算法,有一个转折点:我们将保留一个支持三种操作的段树: 在一个范围内得到最小值 将给定位置的值设置为+INF 对所有l进行范围更新(设置a[i]=min(a[i],new\u val)你知道W总是小于N-K之间的权重吗?否则你的折叠1-K的想法行不通,对吗?实际上,在你的描述中,“1到K”和“K+1到N”之间没有边,5怎么可能是真的?在运行Dijkstra算法时,您会

我有一个图形,具有以下功能-

  • 具有总计N个节点(1,2…N)
  • 所有边都是双向的

  • 1到K的节点(K让我们使用标准的Dijkstra算法,有一个转折点:我们将保留一个支持三种操作的段树:

  • 在一个范围内得到最小值
  • 将给定位置的值设置为+INF

  • 对所有
    l进行范围更新(设置
    a[i]=min(a[i],new\u val)
    你知道W总是小于N-K之间的权重吗?否则你的折叠1-K的想法行不通,对吗?实际上,在你的描述中,“1到K”和“K+1到N”之间没有边,5怎么可能是真的?在运行Dijkstra算法时,您会按顺序找到每个节点的最短路径。因此,当您到达1-K中的任何一个节点时,您可以将1-K中的所有节点添加到找到的路径中,对于您到达的节点,P值为P,对于1-K中的所有节点,P+W值为P(第一次没有其他值)。一件事是,您必须继续考虑1-K中的所有节点,直到您发现路径比P+W更差,因为可能稍后的路径将直接到达节点,并且仍然比P+K更好。这应该具有相同的大O()与Dijkstra的一样,但在实践中可能会更好。@初学者抱歉,我在编写图形功能的第4点时犯了一个错误。我现在已经更改了它。@twain249值“P”是什么意思。没有给节点任何值。我们不能使用“优先级队列”而不是“分段树”吗?@iammangod96我们需要范围更新。优先级队列不行它很有效。你的方法很正确。谢谢你的时间和努力。但是我能够完全按照我所想的方法解决这个问题。所以我将把这个解决方案写在这里,以供将来参考。我一定会对你的答案投赞成票。