日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有向图的深度和广度遍历

發布時間:2024/1/23 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有向图的深度和广度遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目要求:

1.對于下圖所示的有向圖(訪問順序按序號從小到大),試寫出:?

(1)?從頂點出發進行深度優先搜索所得到的深度優先生成樹;

(2)?從頂點出發進行廣度優先搜索所得到的廣度優先生成樹

?

package com.test.tree; import java.util.*;public class Graph {// 存儲節點信息private Object[] vertices;// 存儲邊的信息private int[][] arcs;private int vexnum;// 記錄第i個節點是否被訪問過private boolean[] visited;/*** @param args*/public static void main(String[] args) {Graph g = new Graph(5);Character[] vertices = { '1', '2', '3', '4', '5'};g.addVertex(vertices);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(1, 3);g.addEdge(1, 4);g.addEdge(2, 3);g.addEdge(3, 4);g.addEdge(4, 0);System.out.println("深度優先遍歷:");g.depthTraverse();System.out.println();System.out.println("廣度優先遍歷:");g.broadTraverse2(1);System.out.println();}public Graph(int n) {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;}}}public void addVertex(Object[] obj) {this.vertices = obj;}public void addEdge(int i, int j) {if (i == j)return;arcs[i][j] = 1; //單獨一條表示有向圖//arcs[j][i] = 1; // 這一條打開是無線圖}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;}// 深度優先遍歷public void depthTraverse() {for (int i = 0; i < vexnum; i++) {visited[i] = false;}for (int i = 0; i < vexnum; i++) {if (!visited[i])traverse(i);}}// 一個連通圖的深度遞歸遍歷public void traverse(int i) {// TODO Auto-generated method stubvisited[i] = true;visit(i);for (int j = this.firstAdjVex(i); j >= 0; j = this.nextAdjVex(i, j)) {if (!visited[j])this.traverse(j);}}// 廣度優先遍歷 任意節點開始,這里是第二節點開始public void broadTraverse2(int n) {// LinkedList實現了Queue接口Queue<Integer> q = new LinkedList<Integer>();for (int i = 0; i < vexnum; i++) {visited[i] = false;}if (!visited[n]) {q.add(n);visited[n] = true;visit(n);while (!q.isEmpty()) {int j = (Integer) q.remove().intValue();int k = this.firstAdjVex(j);for ( k = this.firstAdjVex(j); k >= 0; k = this.nextAdjVex(j, k)) {if (!visited[k]) {q.add(k);visited[k] = true;visit(k);}}}}}// 廣度優先遍歷 默認從0開始public void broadTraverse(int n) {// LinkedList實現了Queue接口Queue<Integer> q = new LinkedList<Integer>();for (int i = 0; i < vexnum; i++) {visited[i] = false;}for (int i = 0; i < vexnum; i++) {if (!visited[i]) {q.add(i);visited[i] = true;visit(i);while (!q.isEmpty()) {int j = (Integer) q.remove().intValue();for (int k = this.firstAdjVex(j); k >= 0; k = this.nextAdjVex(j, k)) {if (!visited[k]) {q.add(k);visited[k] = true;visit(k);}}}}}}private void visit(int i) {// TODO Auto-generated method stubSystem.out.print(vertices[i] + " ");}// 最后一個public int lastAdjVex(int i) {for (int j = vexnum - 1; j >= 0; j--) {if (arcs[i][j] > 0)return j;}return -1;}// 上一個public int lastAdjVex(int i, int k) {for (int j = k - 1; j >= 0; j--) {if (arcs[i][j] > 0)return j;}return -1;} }

總結

以上是生活随笔為你收集整理的有向图的深度和广度遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。