基于Java實現(xiàn)的圖的廣度優(yōu)先遍歷算法
本文以實例形式講述了基于Java的圖的廣度優(yōu)先遍歷算法實現(xiàn)方法,具體方法如下:
用鄰接矩陣存儲圖方法:
1.確定圖的頂點個數(shù)和邊的個數(shù)
2.輸入頂點信息存儲在一維數(shù)組vertex中
3.初始化鄰接矩陣;
4.依次輸入每條邊存儲在鄰接矩陣arc中
輸入邊依附的兩個頂點的序號i,j;
將鄰接矩陣的第i行第j列的元素值置為1;
將鄰接矩陣的第j行第i列的元素值置為1;
廣度優(yōu)先遍歷實現(xiàn):
1.初始化隊列Q
2.訪問頂點v;visited[v]=1;頂點v入隊Q;
3.while(隊列Q非空)
v=隊列Q的隊頭元素出隊;
w=頂點v的第一個鄰接點
while(w存在)
如果w未被訪問,則訪問頂點w;visited[w]=1;頂點w入隊列Q
w=頂點v的下一個鄰接點
實現(xiàn)代碼如下:
package com.teradata.lsw.sort; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class BFS { // 存儲節(jié)點信息 private Object[] vertices; // 存儲邊的信息數(shù)組 private int[][] arcs; // 邊的條數(shù) private int vexnum; // 記錄第i個節(jié)點是否被訪問過 private boolean[] visited; //構建一個臨時鏈表存已經遍歷過的節(jié)點 private List<Object> temp = new ArrayList<Object>(); /** * @param args * * @author TD_LSW */ public static void main(String[] args) { // TODO Auto-generated method stub BFS g = new BFS(8); Character[] vertices = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' }; g.addVertex(vertices); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(1, 4); g.addEdge(3, 5); g.addEdge(4, 5); g.addEdge(2, 6); g.addEdge(2, 7); System.out.println("圖的廣度優(yōu)先遍歷:"); g.bfs(); } // 廣度優(yōu)先遍歷實現(xiàn) private void bfs() { // TODO Auto-generated method stub for (int i = 0; i < vexnum; i++) { visited[i] = false; } Queue<Integer> q = new LinkedList<Integer>(); for (int i = 0; i < vexnum; i++) { if (!visited[i]) { visited[i] = true; visit(i); q.add(i); while (!q.isEmpty()) { int j = (Integer) q.remove().intValue(); //判斷如果全部遍歷完了就不需要循環(huán)了 if (temp.size() == vexnum) { q.removeAll(q); return; } for (int k = this.firstAdjVex(j); k >= 0; k = this .nextAdjVex(j, k)) { if (!visited[k]) { q.add(k); visited[k] = true; visit(k); } } } } } } // 查找下一個節(jié)點 public int firstAdjVex(int i) { for (int j = 0; j < vexnum; j++) { if (arcs[i][j] > 0) return j; } return -1; } public int nextAdjVex(int i, int k) { for (int j = k + 1; j < vexnum; j++) { if (arcs[i][j] > 0) return j; } return -1; } // 初始化圖的邊 private void addEdge(int i, int j) { // TODO Auto-generated method stub if (i == j) return; arcs[i][j] = 1; arcs[j][i] = 1; } // 初始化圖的節(jié)點 private void addVertex(Object[] object) { // TODO Auto-generated method stub this.vertices = object; } // 圖的初始化 public BFS(int n) { // TODO Auto-generated constructor stub vexnum = n; vertices = new Object[n]; arcs = new int[n][n]; visited = new boolean[n]; for (int i = 0; i < vexnum; i++) { for (int j = 0; j < vexnum; j++) { arcs[i][j] = 0; } } } private void visit(int i) { // TODO Auto-generated method stub temp.add(vertices[i]); System.out.print(vertices[i] + " "); } }
相關文章
mybatisplus中EntityWrapper的常用方法
這篇文章主要介紹了mybatisplus中EntityWrapper的常用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03java 服務器接口快速開發(fā)之servlet詳細教程
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程序或服務連接器,用Java編寫的服務器端程序,具有獨立于平臺和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成動態(tài)Web內容2021-06-06MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)
這篇文章主要給大家介紹了關于MyBatis-Plus實現(xiàn)多表聯(lián)查的方法,MyBatis Plus是一款針對MyBatis框架的增強工具,它提供了很多方便的方法來實現(xiàn)多表聯(lián)查,需要的朋友可以參考下2023-07-07java中hashmap的底層數(shù)據(jù)結構與實現(xiàn)原理
Hashmap是java面試中經常遇到的面試題,大部分都會問其底層原理與實現(xiàn),本人也是被這道題問慘了,為了能夠溫故而知新,特地寫了這篇文章,以便時時學習2021-08-08SpringMVC視圖轉發(fā)重定向區(qū)別及控制器詳解
這篇文章主要為大家介紹了SpringMVC視圖轉發(fā)重定向區(qū)別及控制器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05java LRU(Least Recently Used )詳解及實例代碼
這篇文章主要介紹了java LRU(Least Recently Used )詳解及實例代碼的相關資料,Java里面實現(xiàn)LRU緩存通常有兩種選擇,一種是使用LinkedHashMap,一種是自己設計數(shù)據(jù)結構,使用鏈表+HashMap,需要的朋友可以參考下2016-11-11