图的建立及两种优先搜索实现

利用邻接矩阵法建立一个简单的图,然后利用广度优先搜索(BFS)和深度优先搜索(DFS)测试代码,并实现了深度优先搜索的非递归形式。需要注意的是,由于每次测试前都要初始化图,故每种方法只能单独测试。

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

class GraphVertex { //图的顶点。
    char vertex;
    boolean isVisited;
    public GraphVertex(char vt) {
        vertex = vt; isVisited = false;
    }
    @Override
    public boolean equals(Object obj) {
        return this.vertex == ((GraphVertex)obj).vertex;
    }
    @Override
    public int hashCode() {
        return (this.vertex - ‘0‘);
    }
    @Override
    public String toString() {
        return "" + vertex + ‘\t‘ + isVisited;
    }
}
class Graph {
    int vertexNum;
    GraphVertex[] gVertex; //顶点
    int[][] adjMat; //邻接矩阵
    public Graph(int vertexNum) {
        this.vertexNum = vertexNum;
        gVertex = new GraphVertex[vertexNum];
        adjMat = new int[vertexNum][vertexNum]; //全部元素初始化为0
    }
    public void addVertexs(GraphVertex[] nodes) { //添加顶点
        System.arraycopy(nodes, 0, gVertex, 0, nodes.length);
    }
    public void addEdge(GraphVertex ch1, GraphVertex ch2) { //构造邻接矩阵
        int index1 = getIndex(ch1);
        int index2 = getIndex(ch2);
        adjMat[index1][index2] = 1;
        adjMat[index2][index1] = 1;
    }
    public void BFS(GraphVertex ch) { //广度优先搜索
        Queue<GraphVertex> queue = new LinkedList<GraphVertex>();
        int index = getIndex(ch);
        GraphVertex gv = gVertex[index];
        System.out.print(gv.vertex);
        gv.isVisited = true;
        queue.offer(gv);
        while (!queue.isEmpty()) {
            GraphVertex tmp = queue.poll();
            int i = getIndex(tmp);
            for (int j = 0; j < adjMat[i].length; j++) {
                if(adjMat[i][j] == 1 && gVertex[j].isVisited == false) {
                    System.out.println(gVertex[j].vertex);
                    gVertex[j].isVisited = true;
                    queue.offer(gVertex[j]);
                }
            }
        }
    }
    public void DFS(GraphVertex ch) { // 深度优先搜索(递归实现)
        int index = getIndex(ch);
        GraphVertex gv = gVertex[index];
        System.out.println(gv.vertex);
        gv.isVisited = true;
        for (int j = 0; j < adjMat[index].length; j++) {
            if(adjMat[index][j] == 1 && gVertex[j].isVisited == false) {
                DFS(gVertex[j]);
            }
        }
    }
    public void NonDFS(GraphVertex ch) { //深度优先搜索(非递归实现)
        Stack<GraphVertex> stack = new Stack<GraphVertex>();
        int index = getIndex(ch);
        GraphVertex gv = gVertex[index];
        System.out.println(gv.vertex);
        gv.isVisited = true;
        stack.push(gv);
        while (!stack.isEmpty()) {
            GraphVertex tmp = stack.peek();
            int nextIndex = nextNotVisitVertex(tmp);
            if(nextIndex == -1)
                stack.pop();
            else {
                GraphVertex vtex = gVertex[nextIndex];
                System.out.println(vtex.vertex);
                vtex.isVisited = true;
                stack.push(vtex);
            }
        }
    }

    public int nextNotVisitVertex(GraphVertex tmp) {
        int index = getIndex(tmp);
        for (int j = 0; j < adjMat[index].length; j++) {
            if(adjMat[index][j] == 1 && gVertex[j].isVisited == false) {
                return j;
            }
        }
        return -1;
    }
    public int getIndex(GraphVertex gv) {
        for (int i = 0; i < gVertex.length; i++) {
            if(gv.equals(gVertex[i]))
                return i;
        }
        return Integer.MAX_VALUE;
    }
}
public class TestClass { //测试类
    public static void addEdges(Graph graph, String[] edges) {
        for (int i = 0; i < edges.length; i++) {
            char ch1 = edges[i].charAt(0);
            char ch2 = edges[i].charAt(1);
            graph.addEdge(new GraphVertex(ch1), new GraphVertex((ch2)));
        }
    }
    public static void main(String[] args) {
        char[] vertexs = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘};
        String[] edges = {"AB", "AE", "BC", "BD", "BE", "CD", "DE"};
        Graph graph = new Graph(vertexs.length);
        GraphVertex[] nodes = new GraphVertex[vertexs.length];
        for (int i = 0; i < nodes.length; i++) {
            nodes[i] = new GraphVertex(vertexs[i]);
        }
        graph.addVertexs(nodes);
        addEdges(graph, edges);

//        graph.BFS(new GraphVertex(‘A‘));
//        graph.DFS(new GraphVertex(‘A‘));
        graph.NonDFS(new GraphVertex(‘A‘));
    }
}
时间: 2024-10-18 06:44:44

图的建立及两种优先搜索实现的相关文章

微信企业号两种常用搜索加载方式

微信企业端两种常用搜索方式 一:在搜索框中进行加载搜索结果 1.html部分代码和js部分代码 <div class="page__bd" style="height: 100%;"> <div class="weui-search-bar" id="searchBar"> <form class="weui-search-bar__form"> <div clas

【转】思维导图编写测试用例的两种格式

现在有一个需求,完整的描述如下: 现在有一个 PC 客户端的命令行工具,这个工具可以接收三个命令行参数,其中,前两个是数字,最后一个是运算符,运算符只支持加减乘除四种,工具的功能就是把前两个数字使用运算符做下运算,然后输出运算结果. 分别使用两种格式来编写的测试用例如下图所示(部分用例): 第一种风格,完全是遵循脑图的本来用法,属于层级递进式,前面层级都是后面层级的前置条件,需要把每一个分支的所有层级全部组合到一起,才是一条完整的用例. 第二种风格,是按照要素归类的方式,每一层都是同一要素的不同

echarts 折线图百分比 tooltip 实例 两种方法

方法一 在知道有几个类型时:下面有五个类型 tooltip : { show : true, trigger: 'axis', formatter: '{b0}<br/>{a0}: {c0}%<br />{a1}: {c1}%<br />{a2}: {c2}%<br />{a3}: {c3}%<br />{a4}: {c4}%' }, 如图: 方法二 在不知道几个类型时: 自定义类型 client.get("/charList"

图的两种遍历方式

图的遍历有两种:深度优先和广度优先.本文中,深度优先使用递归实现,每次递归找到第一个与当前结点相连且未输出过的结点继续往下递归,直至所有结点都已输出.广度优先将开始结点的所有邻接结点全部压入栈,当栈不为空时一直循环将栈首的结点的所有相邻结点压入栈. 具体代码实现如下: 1 //邻接链表 2 class Graph { 3 private: 4 //n: number of nodes 5 int n; 6 vector<int> *edges; 7 bool *visited; 8 publi

C++中对象创建的两种方式

在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A:这两种方式是有区别的. 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象.使用这种方法,直接调用类的构造函数. 动态建立类对象,是使用new运算符将对象建立在堆空间中.这个过程分为两步,第一步是执行operator new()函数,在堆空间中搜索合适的内存并进行分配:第二步是调用构造函数构造对象,初

用easyui实现查询条件的后端传递并自动刷新表格的两种方法

用easyui实现查询条件的后端传递并自动刷新表格的两种方法 搜索框如下: 通过datagrid的load方法直接传递参数并自动刷新表格 通过ajax的post函数传递参数并通过loadData方法将数据初始化到表格中 js代码(搜索按钮的点击事件部分): $("#standardQueryBtn").click(function(){//点击搜索按钮的触发事件 if($("#offerid").val() != ""){//判断id搜索框的值是

学习笔记:图的DFS和BFS的两种搜索办法

  在学习图结构的过程中,DFS和BFS是两种不同的遍历方式,其寻找元素具有不同的优点和缺陷. BFS被称作广度优先算法, 在遍历整个图的过程中,BFS将采用入队的方式进行,值得一提的是,这和树结构中的层序遍历有很大的相似之处. 在层序遍历中,将父亲节点入队后,在父亲节点出队后,将其儿子节点入队. 同理在图的BFS遍历中,先让BFS的首元素入队,在收元素入队后将他的儿子节点入队,放能够实现BFS搜索,他们的整体思想是一样的. 1 void TraversalGraph_BFS(LGraph Gr

图的两种存储(邻接矩阵和邻接表)和两种遍历(DFS和BFS)

图的表示有很多,形式不固定,我暂时先记录我已经懂了的,能写的两种即大多数人应该都知道的邻接矩阵和邻接表. 邻接矩阵: 这里的邻接矩阵和离散数学说的有一点不同,至少有向图的邻接矩阵不同(离散书上的有向图的邻接矩阵求法到是有点像求任意两点的最短路径的Floyd算法) 以上都是(我现有知识认为的)废话: 重点 : G : 表示图: Nv:表示图的点数: Ne:表示图的边数: 邻接矩阵 即是一个 Nv * Nv 的矩阵,矩阵是用来储存  权值的(如果是带权图且有边的话),如果是无权图的的话,如果两顶点有

有向无环图(DAG)拓扑排序的两种方法

如下图的DAG: 第一种: (1)从AOV网中选择一个没有前驱的顶点并且输出它: (2)从AOV网中删除该顶点,并且上去所有该顶点为尾的弧: (3)重复上述两步,直到全部顶点都被输出,或者AOV网中不存在没有前驱的顶点. 第二种: 使用深度优先搜索(DFS),并标记每一个节点的第一次访问(pre)和最后一次访问时间(post),最后post的逆序就是DAG的拓扑排序,其实也是节点在进行DFS搜索时,出栈的逆序就是拓扑排序. 拓扑序列的结果有: (1) c++,高等数学,离散数学,数据结构,概率论