美文网首页
Java 算法-图中两个点之间的路线(深搜或者广搜)

Java 算法-图中两个点之间的路线(深搜或者广搜)

作者: 琼珶和予 | 来源:发表于2018-01-11 09:49 被阅读0次

      说实话,这道题把我坑惨了!我以为就是简单的从头开始深搜到尾,但是错了!害得我一直超时!

    题意:
    给出一张有向图,设计一个算法判断两个点 s 与 t 之间是否存在路线。
    
    样例:
    A----->B----->C
     \     |
      \    |
       \   |
        \  v
         ->D----->E
    
    for s = B and t = E, return true
    
    for s = D and t = C, return false
    

    1.深搜算法

      首先,我在这里不得不吐槽,这道题把我坑惨了,其实也怪我没有没有认真的审题。=
      我开始一直认为,图的遍历必须从头遍历开始,谁知道一直超时,一直卡在70%样例。后来看了他们的代码,发现他们都是从s开始遍历的,因此,我从s开始遍历,于是乎,过了。
      还有一个原因,之所以我比较坚持深搜做这道题,是因为网络有很多这道题的解法,但是没有具体的深搜解法,所以我想锻炼一下自己,自己来写!

    (1).代码

    private boolean flag1 = false;
         private boolean flag2 = false;
    
         public boolean hasRoute(ArrayList<DirectedGraphNode> graph, DirectedGraphNode s, DirectedGraphNode t) {
             if(s == t){
                 return true;
             }
             //这里记得flag1初始化为true,因为我们从s开始,表示已经存在访问s点了
             flag1 = true;
             dfs(s.neighbors, s, t, true, false);
             return flag1 && flag2;
         }
    
         private void dfs(ArrayList<DirectedGraphNode> graph, DirectedGraphNode s, DirectedGraphNode t, boolean flag1, boolean flag2) {
             for (int i = 0; i < graph.size(); i++) {
                 //如果点为t,则将flag2置为true
                 if (graph.get(i)== t) {
                     flag2 = true;
                 }else{
                     //如果不是的话,继续往下搜
                     dfs(graph.get(i).neighbors, s, t, flag1, flag2);
                 }
                 if (flag1 && flag2) {
                     this.flag1 = true;
                     this.flag2 = true;
                     return;
                 }
             }
         }
    

    2.广搜算法

    public boolean hasRoute(ArrayList<DirectedGraphNode> graph, DirectedGraphNode s, DirectedGraphNode t) {
            
            if(s == t) {
                return true;
            }
            Queue<DirectedGraphNode> queue = new LinkedList<>();
            //主要是来保存已经访问过的节点,已经访问的过节点,之后我们不会再访问了
            Set<DirectedGraphNode> set = new HashSet<>();
            //一样的道理,从s开始搜索
            queue.offer(s);
            set.add(s);
            while(!queue.isEmpty()) {
                DirectedGraphNode node = queue.poll();
                for(int i = 0; i < node.neighbors.size(); i++) {
                    //已经访问过了,不在访问了
                    if(set.contains(node.neighbors.get(i))) {
                        continue;
                    }
                    //如果节点等于t,表示有这条路径
                    if(node.neighbors.get(i) == t) {
                        return true;
                    }
                    queue.offer(node.neighbors.get(i));
                    set.add(node.neighbors.get(i));
                    
                }
            }
            return false;
        }
    

    相关文章

      网友评论

          本文标题:Java 算法-图中两个点之间的路线(深搜或者广搜)

          本文链接:https://www.haomeiwen.com/subject/qbkznxtx.html