这是我在网上法官网站上发现的问题:
我有一个无向图(带有循环)。我们在图中有不同类别的顶点。您可以将第1类顶点视为绿色,将第2类顶点视为红色,依此类推。还有一类特殊的顶点颜色(稍后)。
现在,用户将指定源顶点,目标顶点和一系列不同顶点类(非白色),例如。
我们获得了源顶点10,目标顶点40和序列:红色 - >蓝色 - >黑色。
我们必须找到最短路径,使得路径从顶点10开始,接触1个红色顶点,然后是1个蓝色和1个黑色顶点,然后到达顶点40。然而,路径可以根据需要拥有尽可能多的白色顶点。它还可以遍历白色顶点两次。
因此解决方案可以是:10-> 20(白色) - > 35(红色) - > 21(白色) - > 22(白色) - > 30(蓝色) - > 34(黑) - →40
不正确:
10→20(白色) - →30(蓝色) - > 21(白色) - > 22(白色) - →35(红色) - > 34(黑色) - →40 (在红色之前变为蓝色)
10→20(白色) - →35(红色) - > 56(红色) - > 21(白色) - > 22(白色) - →30(蓝色) - > 34 (黑色) - > 40(穿过红色两次)
答案 0 :(得分:1)
你可以使用dijkstra算法和附加标志来显示顶点的路径是否满足条件。
答案 1 :(得分:1)
假设A1 (稍后解除):序列S中没有颜色存在两次。
然后我们可以使用以下算法B1 :
现在我们放松A1:假设A2:在S中只有一种颜色存在多次
算法B2 :
延伸到序列中的几种重复颜色:
将序列拆分为没有重复颜色的序列,并类似地应用B2。
答案 2 :(得分:1)
我可以根据使用bfs修改完成的简单图形修改建议 O(n *(n + m))解决方案。让我一步一步地描述它。
图表修改。
第二点可以通过从仅通过白色顶点的每个顶点运行 bfs 来完成。这将在O(n *(n + m))中运行。
<强>等价性。强>
现在我们有一个没有白色顶点的加权彩色图形,并且很容易看到修改后问题保持不变 - 我们仍然需要找到从源顶点到目标顶点的最短路径(现在就边缘权重和而言)。
搜索算法。
要解决此图表上的问题,请运行bfs的变体,其中的图层对应于提供的路径的颜色。这意味着,如果给出路径为红色 - >蓝色 - >黑色,则第一个移动bfs将进入与源相邻的所有红色顶点,然后移动到与那些红色标记相邻的所有蓝色,然后到达与那些相邻的所有黑色蓝色标记,最后到目标。当某个顶点被推入bfs队列时,请记住它的路径长度以备将来使用。
<强>伪代码。强>
<强>复杂度:强>
图形修改需要 O(n *(n + m))运行时间,第二部分将运行 O(n * n),因为给定的长度path不能超过n(语句中没有颜色重复),并且在每一步中 currentVertexes 中最多只能有n个顶点。总复杂度为 O(n *(n + m))+ O(n * n)= O(n *(n + m))