Java实现无向图的邻接列表表示,深度遍历及广度遍历
生活随笔
收集整理的這篇文章主要介紹了
Java实现无向图的邻接列表表示,深度遍历及广度遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖
- 1. 圖的表示
- 2. 圖的分類
- 3. 圖的表示
- 4. 圖的遍歷
- 5. 源碼
- 5.1 圖的鄰接列表表示
- 5.1 鄰接列表寬度優先、深度優先遍歷
1. 圖的表示
圖用 G = (V,E)表示。V表示頂點集,E表示每條邊。
n = |V|, m = |E|, 表示有 n個頂點,m條邊。
頂點n 與 邊數m 的關系:m ——(n-1 ~ n^2)之間;
2. 圖的分類
圖根據邊有無方向,分為有向圖、無向圖;
圖根據頂點數與邊數的關系,分為稀疏圖、稠密圖。
頂點數n與邊數m大致呈線性關系的為稀疏圖,頂點數n與邊數m大致呈平方關系的為稠密圖(m~n^2)。
3. 圖的表示
可以用鄰接列表、鄰接矩陣來表示圖。
稀疏圖一般用鄰接列表(占用空間大致為m+n),稠密圖用鄰接矩陣表示(占用空間為n^2,稀疏圖如果用鄰接矩陣表示太浪費空間,所以鄰接矩陣一般只表示小的稀疏圖或者稠密圖)。
4. 圖的遍歷
寬度優先、深度優先遍歷
- 寬度優先遍歷 BFS Breadth First Search
- 深度優先遍歷 DFS Depth First Search
示例圖A:
示例圖B:
5. 源碼
遍歷結果效果圖:
5.1 圖的鄰接列表表示
package graph;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/**************************************Class Name: Graph*Description: <圖的鄰接列表表示方法>*@author: Seminar*@create: 2021/5/11*@since 1.0.0*************************************/
public class Graph {private List<String> vList;private Map<String, List<String>> eList;public Graph(List<String> vList, Map<String, List<String>> eList) {this.vList = vList;this.eList = eList;}public List<String> getvList() {return vList;}public Map<String, List<String>> geteList() {return eList;}public static Graph initA() {List<String> vList = new ArrayList();Map<String, List<String>> eList = new HashMap();vList.add("s");vList.add("a");vList.add("b");vList.add("c");vList.add("d");vList.add("e");List<String> sList = new ArrayList<>();sList.add("a");sList.add("b");eList.put("s", sList);List<String> aList = new ArrayList<>();aList.add("s");aList.add("c");eList.put("a", aList);List<String> bList = new ArrayList<>();bList.add("s");bList.add("c");bList.add("d");eList.put("b", bList);List<String> cList = new ArrayList<>();cList.add("a");cList.add("b");cList.add("d");cList.add("e");eList.put("c", cList);List<String> dList = new ArrayList<>();dList.add("b");dList.add("c");dList.add("e");eList.put("d", dList);List<String> e1List = new ArrayList<>();e1List.add("c");e1List.add("d");eList.put("e", e1List);return new Graph(vList, eList);}public static Graph initB() {List<String> vList = new ArrayList();Map<String, List<String>> eList = new HashMap();vList.add("1");vList.add("2");vList.add("3");vList.add("4");vList.add("5");vList.add("6");vList.add("7");vList.add("8");List<String> oneList = new ArrayList<>();oneList.add("2");oneList.add("3");eList.put("1", oneList);List<String> twoList = new ArrayList<>();twoList.add("1");twoList.add("4");twoList.add("5");eList.put("2", twoList);List<String> threeList = new ArrayList<>();threeList.add("1");threeList.add("6");threeList.add("7");eList.put("3", threeList);List<String> fourList = new ArrayList<>();fourList.add("2");fourList.add("8");eList.put("4", fourList);eList.put("5", fourList);List<String> sixList = new ArrayList<>();sixList.add("3");eList.put("6", sixList);eList.put("7", sixList);List<String> eightList = new ArrayList<>();eightList.add("4");eightList.add("5");eList.put("8", eightList);return new Graph(vList, eList);}
}
5.1 鄰接列表寬度優先、深度優先遍歷
package graph;import java.util.*;/**************************************Class Name: GenericSearch*Description: <基本遍歷查找>*@author: Seminar*@create: 2021/5/11*@since 1.0.0*************************************/
public class GenericSearch {/*** Breadth First Search 寬度優先遍歷** @param graph 無向圖* @param first 起點*/public static void BFS(Graph graph, String first) {// 寬度優先遍歷Queue<String> queue = new ArrayDeque<>();queue.add(first);Map<String, Boolean> map = new HashMap<>();for (String str : graph.getvList()) {map.put(str, Boolean.FALSE);}String bfsStr = "BFS: ";while (queue.size() > 0) {String v = queue.poll();if (map.get(v) == Boolean.TRUE) {continue;}bfsStr += v + " -> ";
// System.out.print(v + " -> ");// 標記為“已探索”map.put(v, Boolean.TRUE);for (String w : graph.geteList().get(v)) {queue.add(w);}}System.out.println(bfsStr.substring(0, bfsStr.length() - 4));}/*** Depth First Search 深度優先遍歷** @param graph 無向圖* @param first 起點*/public static void DFS(Graph graph, String first) {Queue<String> queue = new ArrayDeque<>();queue.add(first);Deque<String> deque = new ArrayDeque<>();deque.add(first);Map<String, Boolean> map = new HashMap<>();for (String str : graph.getvList()) {map.put(str, Boolean.FALSE);}// 深度優先遍歷String dfsStr = "DFS: ";String vv = "";while (deque.size() > 0) {vv = deque.poll();for (String w : graph.geteList().get(vv)) {while (queue.size() > 0) {vv = queue.poll();if (map.get(vv) == Boolean.TRUE) {continue;}dfsStr += vv + " -> ";
// System.out.println(vv);// 標記為“已探索”map.put(vv, Boolean.TRUE);for (String w1 : graph.geteList().get(vv)) {if (map.get(w1) == Boolean.TRUE) {continue;}queue.add(w1);deque.add(w1);break;}}if (map.get(w) == Boolean.TRUE) {continue;} else {queue.add(w);deque.add(w);}}}System.out.println(dfsStr.substring(0, dfsStr.length() - 4));}public static void main(String[] args) {Graph graphA = Graph.initA();String first = "s";System.out.println("圖A:");BFS(graphA, first);DFS(graphA, first);System.out.println();Graph graphB = Graph.initB();first = "1";System.out.println("圖B:");BFS(graphB, first);DFS(graphB, first);}
}
總結
以上是生活随笔為你收集整理的Java实现无向图的邻接列表表示,深度遍历及广度遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: logback-spring.xml读取
- 下一篇: Postgresql相关数据库、表占用磁