您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java怎么實現圖的遍歷”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java怎么實現圖的遍歷”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
從圖中某一頂點出發訪問圖中其余頂點,且每個頂點僅被訪問一次
圖的遍歷有兩種深度優先遍歷DFS、廣度優先遍歷BFS
深度優先遍歷以深度為優先進行遍歷,簡單來說就是每次走到底。類似于二叉樹的前序遍歷
思路:
1.以某一個頂點為起點進行深度優先遍歷,并標記該頂點已訪問
2.以該頂點為起點選取任意一條路徑一直遍歷到底,并標記訪問過的頂點
3.第2步遍歷到底后回退到上一個頂點,重復第2步
4.遍歷所有頂點結束
根據遍歷思路可知,這是一個遞歸的過程,其實DFS與回溯基本相同。
遍歷:
以此圖為例進行深度優先遍歷
static void dfs(int[][] graph,int idx,boolean[]visit) { int len = graph.length; //訪問過 if(visit[idx]) return; //訪問該頂點 System.out.println("V"+idx); //標志頂點 visit[idx] = true; for(int i = 1;i < len;i++) { //訪問該頂點相連的所有邊 if(graph[idx][i] == 1) { //遞歸進行dfs遍歷 dfs(graph, i, visit); } } }
遍歷結果:
V1
V2
V3
V4
V5
V6
V7
V8
V9
創建圖的代碼:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //頂點數 以1開始 int n = scanner.nextInt(); int[][] graph = new int[n+1][n+1]; //邊數 int m = scanner.nextInt(); for(int i = 1;i <= m;i++) { int v1 = scanner.nextInt(); int v2 = scanner.nextInt(); graph[v1][v2] = 1; graph[v2][v1] = 1; } //標記數組 false表示未訪問過 boolean[] visit = new boolean[n+1]; dfs(graph, 1, visit); }
思路:遍歷某一個頂點時,如果除了上一個頂點之外,還存在其他相連頂點被訪問過,則必然存在環
//默認無環 static boolean flag = false; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //頂點數 以1開始 int n = scanner.nextInt(); int[][] graph = new int[n+1][n+1]; //邊數 int m = scanner.nextInt(); for(int i = 1;i <= m;i++) { int v1 = scanner.nextInt(); int v2 = scanner.nextInt(); graph[v1][v2] = 1; } //標記數組 true為訪問過 boolean[] visit = new boolean[n+1]; dfs(graph, 1, visit,1); if(flag) System.out.println("有環"); } static void dfs(int[][] graph,int idx,boolean[]visit,int parent) { int len = graph.length; System.out.println("V"+idx); //標記頂點 visit[idx] = true; for(int i = 1;i < len;i++) { //訪問該頂點相連的所有邊 if(graph[idx][i] == 1) { if( !visit[i] ) { dfs(graph, i, visit,idx); } else if(idx != i) { flag = true; } } } }
注意:是有向圖判斷是否存在環,無向圖判斷是否存在環無意義,因為任意兩個存在路徑的頂點都可以是環
廣度優先遍歷是以廣度(寬度)為優先進行遍歷。類似于二叉樹的層序遍歷
思路:
1.以某一個頂點為起點進行廣度優先遍歷,并標記該頂點已訪問
2.訪問所有與該頂點相連且未被訪問過的頂點,并標記訪問過的頂點
3.以第2步訪問所得頂點為起點重復1、2步驟
4.遍歷所有頂點結束
通過隊列來輔助遍歷,隊列出隊順序即是廣度優先遍歷結果
遍歷
以此圖為例,采用鄰接矩陣的方式創建圖,進行BFS遍歷
static void bfs(int[][] graph) { int len = graph.length; //標記數組 false表示未訪問過 boolean[] visit = new boolean[len]; //輔助隊列 Queue<Integer> queue = new LinkedList<>(); queue.offer(1); visit[1] = true; while(!queue.isEmpty()) { int num = queue.poll(); System.out.println("V"+num); //遍歷該頂點所有相連頂點 for(int i = 1;i < len;i++) { //相連并且沒有被訪問過 if(graph[num][i] == 1 && !visit[i]) { queue.offer(i); visit[i] = true; } } } }
遍歷結果:
V1
V2
V6
V3
V7
V9
V5
V4
V8
創建圖的代碼
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //頂點數 以1開始 int n = scanner.nextInt(); int[][] graph = new int[n+1][n+1]; //邊數 int m = scanner.nextInt(); for(int i = 1;i <= m;i++) { int v1 = scanner.nextInt(); int v2 = scanner.nextInt(); graph[v1][v2] = 1; graph[v2][v1] = 1; } bfs(graph); }
讀到這里,這篇“Java怎么實現圖的遍歷”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。