图的邻接矩阵存储下的深度优先遍历

来源:互联网 发布:忘了淘宝账号怎么办 编辑:程序博客网 时间: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
原创粉丝点击