有向路径检查

《程序员面试金典》中的一道题

题目描述

对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径。

给定图中的两个结点的指针DirectedGraphNode* a, DirectedGraphNode* b(请不要在意数据类型,图是有向图),请返回一个bool,代表两点之间是否存在一条路径(a到b或b到a)。

java代码

有向图的节点

public class UndirectedGraphNode {

    int label =0;

    UndirectedGraphNodeleft =null;

    UndirectedGraphNoderight =null;

    ArrayListneighbors =new ArrayList();

    public UndirectedGraphNode(int label) {

            this.label = label;

    }

}

思路:

    有向图检索有两种方式——深度优先、广度优先。这个检查用到的是深度优先查询,首先解决的问题是如何记录节点被访问了,这里采用了Set集合。

public boolean checkPath(UndirectedGraphNode a, UndirectedGraphNode b) {

    if (a ==null || b ==null){

        return false ;

    }

    Set set =new HashSet<>();

    boolean res = checkPath(a, b, set);

    set.clear();

    return res || checkPath(b, a,set);

}

private boolean checkPath(UndirectedGraphNode a, UndirectedGraphNode b, Set set) {

    if (a == b){

        return true ;

    }

    set.add(a);

   for (int i=0 ; i<a.neighboors.size() ; i++)

        if (!set.contains(a.neighbors.get(i)) && checkPath(a.neighbors.get(i),b,set)){

                //如果不包含这个节点且能连接到b点

                return true ;

            }

    }

    return false ;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容