有向图的深度和广度遍历
生活随笔
收集整理的這篇文章主要介紹了
有向图的深度和广度遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目要求:
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;} }總結
以上是生活随笔為你收集整理的有向图的深度和广度遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求数组非连续子序列的最大和
- 下一篇: Jupyter 绘图怎么显示中文