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();
}
}