简单图中的递归回溯

Posted

技术标签:

【中文标题】简单图中的递归回溯【英文标题】:Recursive Backtracking in simple graph 【发布时间】:2015-11-18 14:43:09 【问题描述】:

想象一下下面的简单图表:

每个实体都有一个从 0 开始的索引(因此 A 的索引为 0,B 的索引为 1,依此类推)。

A 和 B 是相连的,所以它们之间的距离是 1,所以 f.e. A 和 D 之间的距离为 2,因为它们都与 F 相连。

如何在java中实现一个方法,将两个索引和一个距离作为参数,并执行递归回溯,以确定两个给定实体是否在给定距离内可达???

所以,如果我用参数(3,0,2)调用方法,那么它应该返回true,因为3是D,0是A,它们之间的距离是2,所以它是真的。

我尝试过的:

public boolean backtracking(int index0, int index1, int d) 

    boolean reachable = relation[index0][index1];

    if (d > 0 && !reachable) 
        for (int i = index0+1; i <= index1+d; i++) 
            backtracking(index0+1, index1, d-1);
        
    

    return reachable;

我有一个邻接矩阵与二维布尔数组关系中的关系,基于图。

提前致谢

【问题讨论】:

到目前为止你写了什么,有什么不足的地方? 您尝试过的代码在哪里? 我更新了我的问题。 【参考方案1】:

以下代码可以满足您的需求。

canReach 方法是一种递归方法。如果允许的distance 小于零,那么我们返回 false。如果给canReach 的节点等于这个,那么它是可达的。否则,迭代Node的邻居,距离减1。

代码:

public class Node 
    private Set<Node> neighbours = new HashSet<Node>();

    public Node() 
    

    public void connect(Node node) 
        if (neighbours.add(node))
            node.connect(this);
    

    public boolean canReach(Node node, int distance) 
        if (distance < 0)
            return false;
        if (this.equals(node)) 
            return true;
         else 
            for (Node neighbour : neighbours)
                if (neighbour.canReach(node, distance - 1))
                    return true;
            return false;
        
    


private Graph() 
    Node a = new Node();
    Node b = new Node();
    Node c = new Node();
    Node d = new Node();
    Node e = new Node();
    Node f = new Node();
    a.connect(b);
    b.connect(c);
    b.connect(e);
    a.connect(f);
    f.connect(d);
    System.out.println(a.canReach(d, 2));



public static void main(String[] args) 
    new Graph();

输出:

false
true

【讨论】:

以上是关于简单图中的递归回溯的主要内容,如果未能解决你的问题,请参考以下文章

算法回溯。计算图中的完美匹配

Java数据结构与算法——递归与回溯

N皇后问题(递归回溯)

有人可以帮助解释这个回溯算法中的递归吗?

算法漫游指北(第十篇):泛型递归递归代码模板递归思维要点分治算法回溯算法

java——递归(动态规划,回溯)