BFS

預先準備

  1. matrix二維陣列,1代表連起來(Connected),0代表不能連。
  2. visted[]陣列,判斷是否已訪問過。
  3. Queue佇列

先把頂點0放入佇列,並設為已訪問,下圖中,箭頭入是放入佇列的方向,箭頭出是從佇列取出的方向。
img

頂點 j=0 j=1 j=2 j=3
i=0 0 1 1 0
i=1 1 0 0 1
i=2 1 0 0 0
i=3 0 1 0 0
頂點 0 1 2 3
visted F T F F F

把頂點0從佇列取出來,印出頂點0。 img

查一下matrix表格中,第0列(i=0)代表頂點0,j是相連頂點,1代表相連,j=1與j=2的時候,是1,是相連的,把頂點1與頂點2放入佇列。

頂點 j=0 j=1 j=2 j=3
i=0 0 1 1 0

img

並把頂點1與頂點2設為已訪問。 |頂點 |0|1|2|3| |visted|T|F T|F T|F|

把頂點1從佇列取出,印出頂點1。 img

查一下matrix表格中,第1列(i=1)代表頂點1,j是相連頂點,1代表相連,j=0與j=3的時候,是1,是相連的,但頂點0已被訪問過,只放入未訪問頂點3放入佇列。

頂點 j=0 j=1 j=2 j=3
i=0 0 1 1 0
i=1 1 0 0 1

img

並把頂點3設為已訪問。 |頂點 |0|1|2|3| |visted|T|T|T|F T|

把頂點2從佇列取出,印出頂點2。 img

把頂點3從佇列取出,印出頂點3。 img

完整程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.LinkedList;

public class BFS {
  private int[][] matrix;
  private int vertexLen = 4;
  private boolean[] visted;

  public BFS() {
    matrix = new int[vertexLen][vertexLen];
    matrix[0] = new int[]{0, 1, 1, 0};
    matrix[1] = new int[]{1, 0, 0, 1};
    matrix[2] = new int[]{1, 0, 0, 0};
    matrix[3] = new int[]{0, 1, 0, 0};
    visted = new boolean[vertexLen];
  }

  public void bfs() {
    LinkedList<Integer> queue = new LinkedList<>();
    // 因為可能會有頂點互相不連通,所以要使用for,確保每個頂點都訪問到。
    for (int i = 0; i < vertexLen; i++) {
      // 是否訪問過?
      if (!visted[i]) {
      	// 沒訪問過才加入queue
        queue.add(i);
        // 設為已訪問
        visted[i] = true;
      }
      // 若queue不為空就一直迴圈
      while (!queue.isEmpty()) {
      	// 從queue取出頂點
        int vertex = queue.poll();
        // 印出頂點
        System.out.print(vertex + "->");
        // 檢查j欄(column)的頂點是否有相連
        for (int j = 0; j < vertexLen; j++) {
          // 沒有被訪問 並且相連
          if (!visted[j] && matrix[vertex][j] == 1) {
          	// 加入queue
            queue.add(j);
            // 設為已訪問
            visted[j] = true;
          }
        }
      }
    }
  }

  public static void main(String[] args) {
    BFS bfs = new BFS();
    bfs.bfs();
  }
}
0->1->2->3->

results matching ""

    No results matching ""