Java 确定在多色节点图的两个节点之间是否可以找到相同颜色节点的路径的最有效算法

Java 确定在多色节点图的两个节点之间是否可以找到相同颜色节点的路径的最有效算法,java,algorithm,graph,nodes,graph-algorithm,Java,Algorithm,Graph,Nodes,Graph Algorithm,如果标题很混乱,我道歉 我正在用Java编写“风险”棋盘游戏,其中的是一个由多种颜色的节点组成的节点图。我需要编写一个算法,确定两个节点之间是否可以找到路径(沿实心空行),其中给定两个节点之间的所有节点(包括两个节点)都具有相同的颜色(较小的内圆的颜色,而不是较大的锥形圆的颜色) 例如,在上面的给定图像中: 东非到乌拉尔是一条有效路径(东非>中东>阿富汗>乌拉尔都是黄色节点) 非洲东部到秘鲁不是(非洲北部打破了黄色节点的路径) 在每个节点上,我能够检查其所有相邻节点的颜色,移动到其中一个相邻

如果标题很混乱,我道歉

我正在用Java编写“风险”棋盘游戏,其中的是一个由多种颜色的节点组成的节点图。我需要编写一个算法,确定两个节点之间是否可以找到路径(沿实心空行),其中给定两个节点之间的所有节点(包括两个节点)都具有相同的颜色(较小的内圆的颜色,而不是较大的锥形圆的颜色)

例如,在上面的给定图像中:

  • 东非到乌拉尔是一条有效路径(东非>中东>阿富汗>乌拉尔都是黄色节点)

  • 非洲东部到秘鲁不是(非洲北部打破了黄色节点的路径)


在每个节点上,我能够检查其所有相邻节点的颜色,移动到其中一个相邻节点上并重复。确定这种路径是否存在的最有效方法是什么


提前感谢您的帮助。

使用边收缩将相同颜色的相邻节点合并为单个节点

为了限制图形更新的代价,让每个节点都有一个指向其收缩的指针,并有一个将节点映射到其最终值的方法。该方法将缓存最终找到的压缩

这使得执行边收缩只是创建一个新节点的问题,将两个旧节点都指向它,并说该节点有邻居=邻居节点的并集

现在,您的算法如下所示:

to_process = all nodes
while to_process:
    node = grab one from to_process
    if node has been contracted:
        skip
    else:
        for each neighbor:
            if neighbor has the same color:
                contract node+neighbor
                put contracted node in to_process
// All same color paths now have length 1.
search for points connected by a single point

如果没有颜色约束,什么是最有效的算法?你能想出一种修改算法来考虑颜色而不会损失很多效率的方法吗?这是一个非常有名的算法,有很多代码示例供你学习。在风险的情况下,所有边的权重都可以为1,因为移动到任何相邻国家的成本都是相同的。更进一步,@realponsum的提示是:假设不是一个节点有几种不同颜色的图,而是有几种不同的图,每个节点只有一种颜色。