Java用邻接矩阵实现广度优先

定义节点类:

//一个节点
class Vertex{
    char label;
    boolean wasVisited;
    public Vertex(char label){
        this.label = label;
        wasVisited = false;
    }
}

图:

class Graph{
    private final int MAX_VERTS = 20;
    private Vertex vertexList[];//节点列表
    private int adjMat[][];//邻接矩阵
    private int nVerts;//节点数

    private Queue theQueue;//协助队列
    public Graph(){
        vertexList = new Vertex[MAX_VERTS];
        adjMat = new int[MAX_VERTS][MAX_VERTS];
        nVerts = 0;
        for(int i = 0; i < MAX_VERTS; i++){
            for(int j = 0; j < MAX_VERTS; j++)
                adjMat[i][j] = 0;
        }
        theQueue = new ArrayDeque();
    }

    public void addVertex(char lab){
        vertexList[nVerts++] = new Vertex(lab);
    }

    public void addEdge(int start, int end){
        adjMat[start][end] = 1;
        adjMat[end][start] = 1;
    }

    public void displayVertex(int v){
        System.out.print(vertexList[v].label);
    }

    //获取为v节点邻接的未被访问的节点
    public int getAdjUnvisiedVertex(int v){
        for(int i = 0; i < nVerts; i++){
            if(adjMat[v][i] == 1 && vertexList[i].wasVisited == false){
                return i;
            }
        }
        return -1;
    }

    //广度优先搜索
    /**
     * 规则1:访问下一个未来访问的邻接点(如果存在),这个顶点必须是当前顶点的邻接点,标记为已访问,并把它插入到队列中
     *
     *
     * 规则2:如果因为已经没有未访问顶点而不能执行规则1,那么从队列头取一个顶点(如果存在),并使其
     * 称为当前顶点
     *
     * 规则3:如果因为队列为空而不能执行规则2,则搜索结束
     */
    public void bfs(){
        vertexList[0].wasVisited = true;
        displayVertex(0);;
        theQueue.offer(0);
        int v2;

        while( !theQueue.isEmpty()){
            int v1 = (int) theQueue.remove();
            while((v2 = getAdjUnvisiedVertex(v1)) != -1){
                vertexList[v2].wasVisited = true;
                displayVertex(v2);
                theQueue.offer(v2);
            }
        }

        for(int i = 0; i < nVerts; i++){
            vertexList[i].wasVisited = false;
        }
    }
}

测试:

        Graph theGraph = new Graph();
        theGraph.addVertex(‘A‘);
        theGraph.addVertex(‘B‘);
        theGraph.addVertex(‘C‘);
        theGraph.addVertex(‘D‘);
        theGraph.addVertex(‘E‘);
        theGraph.addVertex(‘F‘);
        theGraph.addVertex(‘G‘);
        theGraph.addVertex(‘H‘);
        theGraph.addVertex(‘I‘);
        theGraph.addEdge(0, 1);//AB
        theGraph.addEdge(0, 2);//AC
        theGraph.addEdge(0, 3);//AD
        theGraph.addEdge(0, 4);//AE
        theGraph.addEdge(1, 5);//BF
        theGraph.addEdge(5, 6);//FG
        theGraph.addEdge(3, 6);//DG
        theGraph.addEdge(6, 7);//GI

        theGraph.bfs();

广度优先搜索:ABCDEFGH

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 23:47:46

Java用邻接矩阵实现广度优先的相关文章

SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),

Java用邻接矩阵实现图并进行深度优先搜索

先定义节点类 class Vertex{ char label; boolean wasVisited; public Vertex(char label){ this.label = label; wasVisited = false; } } 图: class Graph{ private final int MAX_VERTS = 20; private Vertex vertexList[];//节点列表 private int adjMat[][];//邻接矩阵 private int

SDUT OJ 2413 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

#include<iostream> #include<memory.h> using namespace std; int p[1010][1010]; int visit[110]; int c[1010]; int a=0; int b=1; int k; int t; void bfs(int n) { a++; for(int i=0;i<k;i++) { if(p[n][i]==1&&visit[i]==0) { c[b++]=i; visit[i

存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组

邻接矩阵有向图(三)之 Java详解

前面分别介绍了邻接矩阵有向图的C和C++实现,本文通过Java实现邻接矩阵有向图. 目录 1. 邻接矩阵有向图的介绍 2. 邻接矩阵有向图的代码说明 3. 邻接矩阵有向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接矩阵有向图的介绍 邻接矩阵有向图是指通过邻接矩阵表示的有向图. 上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,<

《图论》——广度优先遍历算法(BFS)

十大算法之广度优先遍历: 本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,详细方法例如以下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组vet中 3.初始化邻接矩阵. 4.依次输入每条边存储在邻接矩阵array中 输入边依附的两个顶点的序号i,j. 将邻接矩阵的第i行第j列的元素值置为1: 将邻接矩阵的第j行第i列的元素值置为1: 广度优先遍历实现: 1.初始化队列Q 2.訪问顶点v:ifVisit[v]=1;顶点v入队Q; 3.whi

广度优先遍历算法(BFS)

十大算法之广度优先遍历: 本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组vet中 3.初始化邻接矩阵: 4.依次输入每条边存储在邻接矩阵array中 输入边依附的两个顶点的序号i,j: 将邻接矩阵的第i行第j列的元素值置为1: 将邻接矩阵的第j行第i列的元素值置为1: 广度优先遍历实现: 1.初始化队列Q 2.访问顶点v:ifVisit[v]=1;顶点v入队Q; 3.while