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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法-图中两个点之间的路线(深搜或者广搜)相关的知识,希望对你有一定的参考价值。

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

题意:

1 给出一张有向图,设计一个算法判断两个点 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).代码

  

 1 private boolean flag1 = false;
 2      private boolean flag2 = false;
 3 
 4      public boolean hasRoute(ArrayList<DirectedGraphNode> graph, DirectedGraphNode s, DirectedGraphNode t) {
 5          if(s == t){
 6              return true;
 7          }
 8          //这里记得flag1初始化为true,因为我们从s开始,表示已经存在访问s点了
 9          flag1 = true;
10          dfs(s.neighbors, s, t, true, false);
11          return flag1 && flag2;
12      }
13 
14      private void dfs(ArrayList<DirectedGraphNode> graph, DirectedGraphNode s, DirectedGraphNode t, boolean flag1, boolean flag2) {
15          for (int i = 0; i < graph.size(); i++) {
16              //如果点为t,则将flag2置为true
17              if (graph.get(i)== t) {
18                  flag2 = true;
19              }else{
20                  //如果不是的话,继续往下搜
21                  dfs(graph.get(i).neighbors, s, t, flag1, flag2);
22              }
23              if (flag1 && flag2) {
24                  this.flag1 = true;
25                  this.flag2 = true;
26                  return;
27              }
28          }
29      }

2.广搜算法

  

 1     public boolean hasRoute(ArrayList<DirectedGraphNode> graph, DirectedGraphNode s, DirectedGraphNode t) {
 2         
 3         if(s == t) {
 4             return true;
 5         }
 6         Queue<DirectedGraphNode> queue = new LinkedList<>();
 7         //主要是来保存已经访问过的节点,已经访问的过节点,之后我们不会再访问了
 8         Set<DirectedGraphNode> set = new HashSet<>();
 9         //一样的道理,从s开始搜索
10         queue.offer(s);
11         set.add(s);
12         while(!queue.isEmpty()) {
13             DirectedGraphNode node = queue.poll();
14             for(int i = 0; i < node.neighbors.size(); i++) {
15                 //已经访问过了,不在访问了
16                 if(set.contains(node.neighbors.get(i))) {
17                     continue;
18                 }
19                 //如果节点等于t,表示有这条路径
20                 if(node.neighbors.get(i) == t) {
21                     return true;
22                 }
23                 queue.offer(node.neighbors.get(i));
24                 set.add(node.neighbors.get(i));
25                 
26             }
27         }
28         return false;
29     }

 

以上是关于算法-图中两个点之间的路线(深搜或者广搜)的主要内容,如果未能解决你的问题,请参考以下文章

图中两个点之间的路线

oj 1792:迷宫 广搜和深搜

求两点间所有路径

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的广搜与深搜模板

BFS最短路径