图的搜索(深度搜索)

来源:互联网 发布:福利app软件论坛 编辑:程序博客网 时间:2024/06/01 07:47

注意:广度搜索需要的是队列
深度搜索需要的是栈

package d19图的搜索;//顶点类public class Vertex {    public char label;    public boolean wasVisited;    public Vertex (char label){        this.label = label;    }}
package d19图的搜索;import d03栈和队列.MyStack;//图public class Graph {    //顶点数组    private Vertex[] vertexList;    //临界矩阵    private  int [] [] adjMat;    //顶点的最大数目    private int maxSize=20;    //栈    private MyStack stack;    //当前节点    private int nVertex;    public Graph(){        vertexList = new Vertex[maxSize];        adjMat = new int [maxSize][maxSize];        for(int i = 0;i<maxSize;i++){            for(int j = 0;j<maxSize;j++){                adjMat[i][j]=0;            }        }        nVertex=0;        stack = new MyStack();    }    //添加顶点    public void addVertex (char label){        vertexList[nVertex++]=new Vertex(label);    }    //添加边    public void addEdge(int start,int end){        adjMat[start][end]=1;        adjMat[end][start]=1;    }    public int getadjUnvisitedVertex(int v){        for(int i = 0;i<nVertex;i++){            if(adjMat[v][i]==1&&vertexList[i].wasVisited==false){                return i;            }        }        return -1;    }    //深度优先搜索    public void dfs(){        //首先访问0号顶点        vertexList[0].wasVisited=true;        //压入栈种        stack.push(0);        //显示该顶点        displayVertex(0);        while(!stack.isEmpty()){            //获得一个为访问过的邻接点            int v = getadjUnvisitedVertex((int)stack.peel());            if(v==-1){                //弹出一个顶点                stack.pop();            }else{                vertexList[v].wasVisited=true;                displayVertex(v);                stack.push(v);            }        }        //搜索完以后要将访问信息修改        for(int i = 0;i<nVertex;i++){            vertexList[i].wasVisited=false;        }    }    public void displayVertex(int v){        System.out.print(vertexList[v].label+" ");    }}
package d19图的搜索;public class TestGraph {    public static void main(String[] args) {        Graph g = new Graph();        g.addVertex('A');        g.addVertex('B');        g.addVertex('C');        g.addVertex('D');        g.addVertex('E');        g.addEdge(0, 1);        g.addEdge(0, 3);        g.addEdge(3, 4);        g.dfs();    }}

引用块内容
这里写图片描述

原创粉丝点击