图的深度优先遍历与广度优先遍历

看了一些书与网上一些例子后,对图进行了一些总结:

1,定义图的数据结构:

class Graph{                              //定义一个图结构
	int n ;                               //图的点的数量        
	boolean visited[] = new boolean[n] ;  //遍历标志
	int matrix [][] = new int[n][n] ;     //图的邻接矩阵
	char vertex[] = new char[n] ;         //点的标志字符
	public Graph(int n){                  //构造函数
		this.n = n ;
	}
	
}

2,图的深度优先遍历与广度优先遍历:

public static void deptSearch(Graph g , int x){    //深度优先遍历
	   for (int i = 0; i < g.n; i++) {
		  if(g.visited[i]==false&&g.matrix[x][i]==1){
			  g.visited[i] = true ;
			  visit(g,i) ;
			  deptSearch(g, i) ;
		  }
	   }
   }
   
   public static void widthSearch(Graph g , int x){   //广度优先遍历
	   LinkedList<Integer> queue = new LinkedList<Integer>() ;   //定义一个队列存储图遍历时的点
	   queue.add(x) ;                                            //访问第一个元素
	   g.visited[x] = true ;                                     //第一个标志为true
	   visit(g,x) ;
	   while(queue.size()!=0){
		   int k = queue.pollFirst() ;                    //获取队列第一个元素
		   for (int i = 0; i < g.n; i++) {
			   if(g.visited[i]==false&&g.matrix[k][i]==1){
				   g.visited[i] = true ;  //遍历的标志位true
				   queue.add(i) ;  //插入队列
				   visit(g,i) ;
			   }
		   }
	   }
   } 
   public static void visit(Graph g,int i){    
	   System.out.print("->"+g.vertex[i]);
   }

3,测试例子:

public class Main {
   private static Scanner scanner = new Scanner(System.in) ;
   public static void main(String[] args) {
	  System.out.println("请输入图的点的数目:") ;
	  int n = scanner.nextInt() ;           //输入图的点的数目
	  Graph g = new Graph(n) ;
	  
	  int matrix[][] = new int[n][n] ;      //图的邻接矩阵
	  System.out.println("请输入图的邻接矩阵:") ;
	  for (int i = 0; i < matrix.length; i++) {
		  for (int j = 0; j < matrix[0].length; j++) {
			 matrix[i][j] = scanner.nextInt() ;
		  }
	  }
	  char []vertex = {'a','b','c','d','e','f','g'} ;  //定义图的点的字符
	  boolean visited[] = new boolean[n] ;             //定义访问标志
	  for (int i = 0; i < visited.length; i++) {   //全部标记为未遍历
		  visited[i] = false ;
	  }
	  
	  
	  g.matrix = matrix ;
	  g.visited = visited ;
	  g.vertex = vertex ;
	  
	  
	  System.out.println("深度度优先遍历---------------------------------------");
	  System.out.print("遍历序列:");
	  deptSearch(g, 0) ;
	  System.out.println();
	 
	  for (int i = 0; i < visited.length; i++) {   //全部标记为未遍历
		  visited[i] = false ;
	  }
	  System.out.println("广度优先遍历---------------------------------------");
	  System.out.print("遍历序列:");
	  widthSearch(g, 0) ;
   }
}

程序运行结果:

测试例子:


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

请输入图的点的数目:
7
请输入图的邻接矩阵:
1 0 1 1 1 1 0
0 1 1 1 0 1 1
1 1 1 0 0 0 0
1 1 0 1 0 0 0
1 0 0 0 1 0 1
1 1 0 0 0 1 1
0 1 0 0 1 1 1

深度度优先遍历---------------------------------------
遍历序列:->a->c->b->d->f->g->e
广度优先遍历---------------------------------------
遍历序列:->a->c->d->e->f->b->g


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章