用深度遍历和广度遍历判断有向图中两个点之间是否存在路径java

本文详细介绍了一种基于图的节点搜索算法,包括深度优先搜索(DFS)和广度优先搜索(BFS)。通过具体实例展示了如何使用这两种算法来查找图中两个特定节点之间的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class UndirectedGraphNode {
   int label = 0;
   UndirectedGraphNode left = null;
   UndirectedGraphNode right = null;
   ArrayList<UndirectedGraphNode> neighbors = new ArrayList<UndirectedGraphNode>();


   public UndirectedGraphNode(int label) {
       this.label = label;
   }
}

 
    /**
     * 深度优先搜索(递归)
     */
Map<UndirectedGraphNode,Boolean> visitedMap = new HashMap<>();
    private boolean checkDFS(UndirectedGraphNode a, UndirectedGraphNode b) {
        if (a == null || b == null) {
            return false;
        }
        if (a == b) {
            return true;
        }
 
        visitedMap.put(a, true);
 
        for (UndirectedGraphNode neighbor : a.neighbors) {
 
//下面的写法是错误的,原因是在这种情况下,如果a先访问邻居c就会最终返回true;如果a先访问到邻居d就会返回false。
//而访问的顺序与存储的结构和存储的顺序有关,所以可能会存在一定概率出错。简单的说,这种写法的含义是,DFS搜索的到的第一条线路如果是要找到就返回true并不在继续找,如果不是返回false,也不会继续找其他线路了.
//               ↗ d → e
//             a
//               ↘ c → b
//            if (!visitedMap.containsKey(neighbor)) {
//                return checkDFS(neighbor, b);
//            }
 
 
//没访问过等于:根本没包含 或者 包含了但是为false(其中第二种情况不可能存在,因为从来没赋值过false)
//这种写法是正确的,含义是:找到了就直接返回true,并不再寻找下一条线路。如果没找到,继续for的下一个循环就行(也就是继续找其他线路,不会return false)
            if (!visitedMap.containsKey(neighbor) && checkDFS(neighbor, b)) {
                return true;
            }
        }
 
        return false;
 
    }
 
    /**
     * 广度优先搜索
     */
    private boolean checkBFS(UndirectedGraphNode a, UndirectedGraphNode b) {
 
        if (a == null || b == null) {
            return false;
        }
        if (a == b) {
            return true;
        }
 
        Queue<UndirectedGraphNode> queue = new LinkedList<>();
        //用来标记是否访问过该节点
        HashMap<UndirectedGraphNode, Boolean> visitedMap = new HashMap<>();
        visitedMap.put(a, true);
        queue.offer(a);
        while (!queue.isEmpty()) {
            UndirectedGraphNode node = queue.poll();//从队列头部移除
            for (UndirectedGraphNode neighbor : node.neighbors) {
                if (!visitedMap.containsKey(neighbor)) {//如果没访问过
 
                    if (neighbor == b) {
                        return true;
                    }
 
                    visitedMap.put(neighbor, true);
 
                    queue.offer(neighbor);
 
                }
            }
        }
 
 
        return false;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值