美文网首页
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 算法-图中两个点之间的路线(深搜或者广搜)

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

  • Java 算法-拓扑排序(深搜或者广搜)

      说实话,在数据结构中,拓扑排序我掌握的不是很好,今天在lintCode上面做了关于拓扑排序的题,才开始还是有点...

  • 搜索算法

    搜索一般指的是深度搜索和广度搜索。这两种搜索算法都有固定的格式,下面是深搜和广搜的固定套路: 1.广搜(BFS) ...

  • 简单的搜索 ----(dfs) 和 (bfs)简单的

    广搜(bfs)和 深搜(dfs) 先从广搜说起(bfs)广搜,字面感觉就是广面的搜索,其实就是这样的,我认为可以把...

  • 16-图的深搜和广搜二

    图的深搜和广搜 前面一篇是利用深搜和广搜进行图的顶点的遍历,今天我们则是根据起点和终点位置进行路径的搜索。 图的深...

  • DFS(深搜)算法

    深度优先搜索算法(Depth-First-Search):是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的...

  • 广搜

    #include#include#includeusingnamespacestd;constintMAXN=10...

  • 15-图的深搜和广搜一

    图的深度和广搜优先遍历 深度优先遍历 深度优先搜索就好比走迷宫,当走到一个岔路口时,你随机选择一条路往下走,当发现...

  • 二叉树的几种遍历方式(附 LeetCode 水题)

    正文之前 闲得无聊去刷 LeetCode 的时候做了一点深搜和广搜的题,但是树的遍历方式还没有写过总结,今天刚好总...

  • 滑雪dp

    经典的dp题:滑雪-dp记忆化深搜 DP 记忆化深搜(1) 如果只有1个点,结果就是1(2) 如果有两个点,从1-...

网友评论

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

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