圖的資料結構及遍歷演算法
阿新 • • 發佈:2019-02-15
圖的鄰接矩陣結構:
public class GraphArray<T> {
private int[][] edges; // 鄰接矩陣
private T[] vertexs; // 頂點
private int[] visited; // 是否訪問
private int number; // 頂點個數
public GraphArray(int[][] edges, T[] vertexs) {
if (edges.length != edges[0].length) {
throw new RuntimeException("矩陣不符合規範" );
}
if (edges.length != vertexs.length) {
throw new RuntimeException("矩陣不符合規範");
}
this.edges = edges;
this.vertexs = vertexs;
number = edges.length;
visited = new int[number];
}
}
深度優先遞迴演算法
// 深度優先遞迴演算法
void DFSTraverse() {
visited = new int[number];
for (int i = 0; i < number; i++) {
if (visited[i] == 0) {
DFS(i);
}
}
}
void DFS(int i) {
visited[i] = 1;
System.out.print(vertexs[i] + " ");
for (int j = 0; j < number; j++) {
if (visited[j] == 0 && edges[i][j] == 1) {
DFS(j);
}
}
}
深度優先非遞迴演算法:
// 深度優先非遞迴演算法
void depth() {
Stack<Integer> s = new Stack<Integer>();
for (int i = 0; i < number; i++) {
if (visited[i] == 0) {
// 訪問頂點併入棧
s.add(i);
visited[i] = 1;
while (!s.isEmpty()) {
int j = s.pop();// 棧頂元素出棧
System.out.print(vertexs[j] + " ");
for (int k = 0; k < number; k++) {
// 棧頂元素的鄰接點(未被訪問的)
if (edges[j][k] == 1 && visited[k] == 0) {
// 訪問此鄰接點併入棧
s.add(k);
visited[k] = 1;
}
}
}
}
}
}
廣度優先演算法:
// 廣度優先演算法
void BFSTraverse() {
visited = new int[number];
Queue<Integer> queue = new LinkedList<Integer>();
for (int i = 0; i < number; i++) {
if (visited[i] == 0) {
// 訪問頂點併入隊
visited[i] = 1;
System.out.print(vertexs[i] + " ");
queue.add(i);
while (!queue.isEmpty()) {
int j = queue.poll();// 隊頭元素出隊
for (int k = 0; k < number; k++) {
// 隊頭元素的鄰接點(未被訪問)
if (edges[j][k] == 1 && visited[k] == 0) {
// 訪問此鄰接點併入隊
visited[k] = 1;
System.out.print(vertexs[k] + " ");
queue.add(k);
}
}
}
}
}
}