深度优先算法 演示,还有不完善的地方

来源:互联网 发布:mac sierra pdf 签名 编辑:程序博客网 时间:2024/06/03 15:59

 package grap;

import java.util.Stack;

/*  A B    C    D
 *A│0   1    1    1
 *B│1   0    1    1
 *C│1   1    0    1
 *D│1   1    1    0

 

 思想:从某一顶点出发,找到邻接表中列位1(可走) 标记位访问

     1、如果可能,访问一个邻接的未访问的顶点,标记它,并把放入栈中。
       2、当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。
       3、如果不能执行规则1和规则2,就完成了整个搜索的过程。
 */
class V{  // 定义顶点
 char label;  // 例如'A'。。
 boolean isVisited=false;
 
 V(char label){
  this.label=label;
 }
 
}
//--------------------------------------------
class VTable{
 Stack sk=new Stack();
 int vNumber=4;// 顶点个数
 V vList[]=new V[vNumber];// 顶点列表
 int matrix[][];
 
 VTable(){
  
   vList[0]=new V('A');
   vList[1]=new V('B');
   vList[2]=new V('C');
   vList[3]=new V('D');
   
   /*
   matrix=new int[][]{
     {1 ,  1  ,  1  ,  1},
     {1 ,  0  ,  1  ,  1},
     {1 ,  1  ,  0  ,  1},
     {1 ,  1  ,  1  ,  0}
     
     
   };
   */
   matrix=new int[][]{
     {0 ,  0  ,  1  ,  1},
     {0 ,  0  ,  1  ,  1},
     {1 ,  1  ,  0  ,  1},
     {1 ,  1  ,  1  ,  0}
     
     
   };
 }
 
 public int getUnVisited(int v){ // 获得未读取未访问顶点
  for(int j=0;j<vNumber;j++) // 遍历第V杭,若邻接表这行的V列节点没有访问,返回这行列的位置
   if(matrix[v][j]==1&&vList[j].isVisited==false)
    return j;
  
  return -1;
 }
 public void display(int v){
  System.out.println(vList[v].label);
 }
 
 // 核心算法,深度搜索
 public void dfs(){
  // 从第一顶点访问
  vList[0].isVisited=true;
  // 打印出来
  display(0);
  // 第一顶点邻接表自身到自身[0][0]值 放进栈
  sk.push(0);
  // 当栈不空
  while(!sk.isEmpty()){
   int v=getUnVisited((Integer) sk.peek()); // 查看栈顶,或得。。。强制转换int
   // 假如没有找到等于1(即找到可以到达的路径)
   // 出栈
   if(v==-1)
    sk.pop();
   // 假如不空,标记访问,进栈
   else{
    vList[v].isVisited=true;
    display(v);
    sk.push(v);
   }
  }
 }
}
//---------------------------------------------
public class DFSdemo {

 
 public static void main(String[] args) {
  VTable t=new VTable();
  t.dfs();
 

 }

}