Java用邻接矩阵实现广度优先
来源:互联网 发布:如果黄家驹还活着知乎 编辑:程序博客网 时间:2024/06/08 01:32
定义节点类:
//一个节点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
6 0
- Java用邻接矩阵实现广度优先
- 邻接矩阵实现的广度优先搜索
- 邻接矩阵实现BFS广度优先搜索
- 邻接矩阵实现深度优先搜索,广度优先搜索
- 用JAVA实现广度优先搜索
- Java实现图:邻接矩阵表示、深度优先搜索、广度优先搜索、无向图的最小生成树
- 图的广度优先搜索(BFS)、深度优先搜索(DFS)(邻接矩阵法和邻接表法java实现)
- 邻接矩阵深度与广度优先遍历算法(c++实现)
- 无向图的广度优先遍历---邻接矩阵实现
- 邻接矩阵实现图+深度/广度优先遍历+最小生成树
- 邻接矩阵实现图+深度/广度优先遍历+最小生成树
- 邻接矩阵的广度优先搜索
- 深度优先、广度优先java实现
- Java用邻接矩阵实现图并进行深度优先搜索
- 图的邻接矩阵存储 深度优先遍历 广度优先遍历 C语言实现
- C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历
- C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 毕业5年决定你的命运
- LeetCode--subsets问题
- 定时同步sql server数据到mysql
- Linux初入门
- mysqlmb4
- Java用邻接矩阵实现广度优先
- B. Pasha and Tea
- leetcode: (125) Valid Palindrome
- EditText设置/隐藏光标位置、选中文本和获取/清除焦点
- Android使用ListView divider属性设置分界线,显示不出来的问题
- sql server中高并发情况下 同时执行select和update语句死锁问题
- 地图打印资源 ArcEngine
- ViewController之间的block传值
- html 添加视频