图的邻接矩阵存储下的深度优先遍历
来源:互联网 发布:忘了淘宝账号怎么办 编辑:程序博客网 时间:2024/06/09 20:14
深度优先遍历(DFS): 借助栈进行遍历,深度优先遍历的序列不是唯一的,邻接矩阵存储的时间复杂度为O(n*n),邻接表的存储的时间复杂度为O(n+e).
邻接矩阵的深度优先遍历的实现代码如下:
package com.threeTop.www;import java.util.Stack;public class MatrixGraph {//通过下标映射元素值private int[] mapping;//图的二维数组private int[][] matrix;/** * 初始化图的顶点 * @param vertexes 顶点数组 */ public MatrixGraph(int []vertexes) { int length=vertexes.length; mapping=new int[length]; matrix=new int[length][length]; //图的二维矩阵 for(int i=0;i<length;i++) {mapping[i]=vertexes[i]; } } /** * 添加边 * @param start * @param end */ public void addEdge(int start,int end) { int x=-1; int y=-1; //寻找坐标 for(int i=0;i<mapping.length;i++) { if(x!=-1&&y!=-1) { break; } if(start==mapping[i]) { x=i; } if(end==mapping[i]) { y=i; } } //判断顶点是否存在 if(x==-1||y==-1||x>mapping.length-1||y>mapping.length-1) { throw new IndexOutOfBoundsException("边的顶点不存在!"); } //增加边 matrix[x][y]=1; } /** *输出矩阵 * */ public void printMatrix() { System.out.println("输出的邻接矩阵如下:"); for(int i=0;i<matrix.length;i++) { for(int j=0;j<matrix[i].length;j++) { //输出一行的数据 System.out.print(matrix[i][j]); } System.out.println(); } } /** * 邻接矩阵深度优先遍历 * */ public void depthFirstTravel() { System.out.println("邻接矩阵的深度优先遍历:"); //初始化栈 Stack <Integer> stack=new Stack<Integer>(); //stack.setSize(mapping.length); //初始化各顶点的访问状态 int []visited=new int[mapping.length]; //从未访问顶点中任选一个顶点作为起始顶点 int unvisited=getUnvisited(visited); //循环遍历没有被访问到的节点 while(unvisited>=0) { //访问起始节点,并入栈 visited[unvisited]=1; stack.push(unvisited); //输出访问过的节点 System.out.print(mapping[unvisited]+" "); while(!stack.isEmpty()) { //获取栈顶的元素,不出栈 int index=stack.peek(); //遍历找到未被访问的邻接顶点 boolean found=false; for(int i=0;i<mapping.length;i++) { //不是自己,未被访问、可到达 if(index!=i&&visited[i]==0&&matrix[index][i]>0) { //如果找打则访问入栈 visited[i]=1; stack.push(i); //输出遍历到的元素 System.out.print(mapping[i]+" "); found=true; break; } } if(!found) { //弹出栈顶的元素 stack.pop(); } } //寻找未被访问的节点 unvisited=getUnvisited(visited); } System.out.println(); }/** * 从访问标记数组中获取第1个发现的未被访问的顶点下标 * @param visited * @return 若都被访问了,就返回-1 */private int getUnvisited(int[] visited) {int index=-1;for(int i=0;i<visited.length;i++){//i节点没有被访问if(visited[i]==0){index=i;break;}}return index;}public static void main(String []args){int[] vetexes={0,1,2,3,4,5,6,7};MatrixGraph graph=new MatrixGraph(vetexes);graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(1, 3);graph.addEdge(1, 4);graph.addEdge(2, 5);graph.addEdge(2, 6);graph.addEdge(3, 7);graph.addEdge(4, 7);graph.addEdge(5, 7);graph.addEdge(6, 7);graph.printMatrix();graph.depthFirstTravel();}}/** * 0 * / \ * 1 2 * / \ / \ * 3 4 5 6 * \ | | / * 7 */
0 0
- 图的邻接矩阵存储下的深度优先遍历
- 【图】图的邻接矩阵存储和广度、深度优先遍历
- 图的邻接矩阵存储:深度、广度优先遍历
- 图的邻接矩阵存储下的广度优先遍历
- 图的邻接矩阵存储 深度优先遍历 广度优先遍历 C语言实现
- C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- 图的邻接矩阵存储表示 深度优先和广度优先遍历
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
- 基于邻接矩阵的深度优先搜索遍历
- 基于邻接矩阵的图的深度优先遍历
- C语言以邻接矩阵为存储结构的图的构造以及广度优先,深度优先遍历
- 图的深度优先遍历(用邻接矩阵表示图)
- 图的深度优先遍历DFS(邻接矩阵表示法)
- 图的邻接表 邻接矩阵 深度优先遍历DFS
- 无向图的邻接矩阵 -- DFS - 深度优先遍历
- SDUT 图的深度优先遍历(邻接矩阵表示)
- 图(邻接矩阵)的深度、广度优先遍历
- thrift 实例
- Objective-C 30分钟入门教程
- PTX ISA 之 cache operator
- mybatis实现mysql数据库模糊查询like %?%
- mybatis数字类型update不成功的问题
- 图的邻接矩阵存储下的深度优先遍历
- JeeSite的Excel导入、导出
- 大数据工程师面试题
- java.lang.NoClassDefFoundError: org/apache/catalina/servlet4preview/http/HttpServletRequest
- linux shell脚本 截取字符串时执行错误:bad substitution
- 「码个蛋」邀约投稿,收获个人成长
- SQL语句杂记
- java多线程批量读取文件(一)
- Guava ImmutableCollection简介