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