欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

寻路

发布时间:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 寻路 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

寻路

  • 寻找图中一个点到标定点的路径;
  • 深度优先遍历整张图;
  • 被遍历到的节点是从哪个节点遍历而来的信息存在 from 数组中;
  • 通过在 from 数组中上溯得到某个节点标定点的路径;
  • 这个由深度优先遍历得到的路径不是最短的

寻路代码实现

package _07._06;import java.util.Vector; import java.util.Stack;public class Path {private Graph G; // 图的引用private int s; // 起始点private boolean[] visited; // 记录dfs的过程中节点是否被访问private int[] from; // 记录路径, from[i]表示查找的路径上i的上一个节点// 图的深度优先遍历private void dfs( int v ){visited[v] = true;for( int i : G.adj(v) )if( !visited[i] ){from[i] = v;dfs(i);}}// 构造函数, 寻路算法, 寻找图graph从s点到其他点的路径public Path(Graph graph, int s){// 算法初始化G = graph;assert s >= 0 && s < G.V();visited = new boolean[G.V()];from = new int[G.V()];for( int i = 0 ; i < G.V() ; i ++ ){visited[i] = false;from[i] = -1;}this.s = s;// 寻路算法dfs(s);}// 查询从s点到w点是否有路径boolean hasPath(int w){assert w >= 0 && w < G.V();return visited[w];}// 查询从s点到w点的路径, 存放在vec中Vector<Integer> path(int w){assert hasPath(w) ;Stack<Integer> s = new Stack<Integer>();// 通过from数组逆向查找到从s到w的路径, 存放到栈中int p = w;while( p != -1 ){s.push(p);p = from[p];}// 从栈中依次取出元素, 获得顺序的从s到w的路径Vector<Integer> res = new Vector<Integer>();while( !s.empty() )res.add( s.pop() );return res;}// 打印出从s点到w点的路径void showPath(int w){assert hasPath(w) ;Vector<Integer> vec = path(w);for( int i = 0 ; i < vec.size() ; i ++ ){System.out.print(vec.elementAt(i));if( i == vec.size() - 1 )System.out.println();elseSystem.out.print(" -> ");}} }

图文件

8 7 0 1 0 3 0 2 3 4 3 5 2 6 2 7

测试代码

package _07._06;public class Main {// 测试寻路算法public static void main(String[] args) {String filename = "testG.txt";SparseGraph g = new SparseGraph(8, false);ReadGraph readGraph = new ReadGraph(g, filename);g.show();System.out.println();Path path = new Path(g,0);System.out.println("Path from 0 to 6 : ");path.showPath(6);} }
输出:
vertex 0: 1 3 2 vertex 1: 0 vertex 2: 0 6 7 vertex 3: 0 4 5 vertex 4: 3 vertex 5: 3 vertex 6: 2 vertex 7: 2 Path from 0 to 6 : 0 -> 2 -> 6

总结

以上是生活随笔为你收集整理的寻路的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。