Algorithm 图中的约束最短路径
以下是我在一个在线法官网站上发现的问题: 我有一个无向图(带循环)。图中有k类不同的顶点。您可以将第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(在红色之前变为蓝色)Algorithm 图中的约束最短路径,algorithm,Algorithm,以下是我在一个在线法官网站上发现的问题: 我有一个无向图(带循环)。图中有k类不同的顶点。您可以将第1类顶点视为绿色,第2类顶点视为红色,依此类推。还有一类特殊的顶点颜色为白色(稍后将详细介绍) 现在,用户将指定一个源顶点、一个目标顶点和一系列不同的顶点类(非白色),例如 我们得到了源顶点10、目标顶点40和一个序列:红色->蓝色->黑色 我们必须找到最短路径,这样路径从顶点10开始,接触1个红色顶点,然后是1个蓝色和1个黑色顶点,然后到达顶点40。但是,路径可以根据需要具有任意多个白色顶点。它
10->20(白色)->35(红色)->56(红色)->21(白色)->22(白色)->30(蓝色)->34(黑色)->40(穿过红色两次)您可以使用dijkstra算法,附加标志显示顶点路径是否满足条件。您可以使用dijkstra算法,附加标志显示顶点路径是否满足条件。假设A1(稍后提升):序列S中不存在两次颜色 然后我们可以使用以下算法B1:
- G'具有与G相同的节点
- 如果v是白色节点且(v,u)存在于G中,则在G'中插入(v,u)和(u,v)
- 如果(v,u)存在于G中且(颜色(v),颜色(u))存在于S中,则在G'中插入(v,u)
- 忽略G的所有其他边(包括循环)
- 将G1中颜色为c0的每个节点与颜色为c3的每个节点以及G2中的任何白色节点连接起来
- 对G2和G3等进行同样的操作
将序列拆分为没有重复颜色的序列,并以类似方式应用B2。假设A1(稍后取消):序列S中不存在两次颜色 然后我们可以使用以下算法B1:
- G'具有与G相同的节点
- 如果v是白色节点且(v,u)存在于G中,则在G'中插入(v,u)和(u,v)
- 如果(v,u)存在于G中且(颜色(v),颜色(u))存在于S中,则在G'中插入(v,u)
- 忽略G的所有其他边(包括循环)
- 将G1中颜色为c0的每个节点与颜色为c3的每个节点以及G2中的任何白色节点连接起来
- 对G2和G3等进行同样的操作
图形修改。