#define MAXV 20
typedef char VertexType;
typedef struct {
VertexType vex[MAXV]; // 頂點表
int arc[MAXV][MAXV]; // 鄰接矩陣
int vexNum, arcNum; // 頂點數、邊數
} Graph;
輸入頂點數、邊數、頂點值、邊的兩端點,矩陣對稱置 1。
int visited[MAXV];
void DFS(Graph G, int v) {
visited[v] = 1;
printf("%c ", G.vex[v]);
for (int w = 0; w < G.vexNum; w++)
if (G.arc[v][w] && !visited[w])
DFS(G, w);
}
void DFSTraverse(Graph G) {
for (int i = 0; i < G.vexNum; i++) visited[i] = 0;
for (int i = 0; i < G.vexNum; i++)
if (!visited[i]) DFS(G, i);
}
typedef struct { int data[MAXV]; int front, rear; } Queue;
void BFSTraverse(Graph G) {
for (int i = 0; i < G.vexNum; i++) visited[i] = 0;
Queue q = {0, 0};
for (int i = 0; i < G.vexNum; i++) {
if (!visited[i]) {
visited[i] = 1; q.data[q.rear++] = i;
while (q.front != q.rear) {
int v = q.data[q.front++];
printf("%c ", G.vex[v]);
for (int w = 0; w < G.vexNum; w++)
if (G.arc[v][w] && !visited[w]) {
visited[w] = 1;
q.data[q.rear++] = w;
}
}
}
}
}
| 特性 | DFS | BFS |
|---|---|---|
| 數據結構 | 棧(遞歸/顯式) | 隊列 |
| 遍歷順序 | 深度優先,一條路走到黑 | 層次優先,逐層展開 |
| 適用場景 | 路徑查找、拓撲排序、連通分量 | 最短路徑(無權圖)、層次遍歷 |
| 空間複雜度 | O(V) 遞歸棧 | O(V) 隊列 |
輸入頂點 A B C D,邊 A-B, A-C, B-D, C-D
DFS: A B D C
BFS: A B C D