您好,登錄后才能下訂單哦!
這篇文章主要介紹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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。