<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
從圖中某一頂點出發存取圖中其餘頂點,且每個頂點僅被存取一次
圖的遍歷有兩種深度優先遍歷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 由淺入深帶你掌握圖的遍歷的文章就介紹到這了,更多相關Java 圖的遍歷內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45