package com.example.demo.SortAlgorithm;
/*
* @Author: i_heh
* @Date: 2019/7/5
* @Time: 14:16
* @Description:
*/
public class DFS {
private int[][] adjMat;
//private int size;
private Vertex[] vertexArr;
private int num;
private StackGraph sg;
public static void main(String[] args) {
DFS g = new DFS(5);
g.addVertex('A');
g.addVertex('B');
g.addVertex('C');
g.addVertex('D');
g.addVertex('E');
g.addVertex('F');
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(2, 3);
g.addEdge(0, 4);
g.showGraph();
System.out.print("visits:");
g.dfs();
//System.out.println();
}
public DFS(int s){
//size = s;
num = 0;
adjMat = new int[s][s];
vertexArr = new Vertex[s];
for(int i=0;i<s;i++){
for(int j=0;j<s;j++){
adjMat[i][j] = 0;
}
}
sg = new StackGraph(s);
}
public void addVertex(char c){
if(num<5){
Vertex nVertex = new Vertex();
nVertex.setName(c);
vertexArr[num] = nVertex;
System.out.println("添加顶点:"+c+",所处数组下标为:"+num);
num++;
}else{
System.out.println("数组已满!");
}
}
public void addEdge(int from,int to){
adjMat[from][to] = 1;
adjMat[to][from] = 1;
}
public void showGraph(){
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
int v = adjMat[i][j];
System.out.print(v+" ");
}
System.out.println();
}
}
public void showVertex(int index){
System.out.print(vertexArr[index].getName());
}
/**
* 深度优先搜索算法
*
*/
public void dfs(){
vertexArr[0].wasVisited = true;
showVertex(0);
sg.push(0);
while(!sg.isEmpty()){
int v = getAdjUnvisitedVertex(sg.peek());
if(v==-1){
sg.pop();//当当前节点找不到未被访问的临近节点时,将其从栈顶弹出
}else{
vertexArr[v].wasVisited = true;
showVertex(v);
sg.push(v);
}
}
for(int j=0;j<num;j++){
vertexArr[j].wasVisited = false;
}
}
/**
* 此方法根据传入的值查找对应的节点是否有未被访问过的临近节点,如果有,则将找到的第一个符合条件的临近节点的下标返回
* 否则返回-1
* @param v
* @return
*/
public int getAdjUnvisitedVertex(int v){
for(int i=0;i<num;i++){
if(adjMat[v][i]==1&&vertexArr[i].wasVisited==false){
return i;//找到一个就返回
}
}
return -1;
}
}
class Vertex{
private char name;
private int index;
public boolean wasVisited;
public Vertex(){
wasVisited = false;
}
public void setName(char c){
this.name = c;
}
public char getName(){
return this.name;
}
public boolean wasVisited(){
return this.wasVisited;
}
}
class StackGraph{
private int[] st;
private int top;
public StackGraph(int size){
st = new int[size];
top = -1;
}
public void push(int j){
st[++top] = j;
}
public int pop(){
return st[top--];
}
public int peek(){
return st[top];
}
public boolean isEmpty(){
return top == -1;
}
}
算法<七>深度优先搜索算法
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 1 深度优先搜索算法 深度优先搜索(Depth First Search)遍历类似于树的先序遍历,是树的先序遍历的...
- 深度优先:深度优先 是从一个顶点开始访问,如果可以访问到下一个未访问过的顶点,就以下一个顶点继续访问,如果不可以访...
- 深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方。这里拿一起讨...
- 广度优先搜索和深度优先搜索是在图的基础上来讨论的,它们都是图的顶点的遍历方式。下面我们一个个来研究一下。 两种遍历...