棧實現的圖鄰接矩陣深度優先遍歷
阿新 • • 發佈:2019-02-19
#include <stdio.h> #define N 6 // 深度優先遍歷 void DFS_Traverse(bool adjmatrix[][N], int v0, void (*f)(int)) { bool visited[N] = {true};// v0設為已訪問 int stack[N] = {v0};// 棧新增v0 int size = 1; f(v0); while (size > 0) { bool bottom = true;// 棧頂頂點是否為最深 int j = 0; while (j < N) { if (adjmatrix[stack[size - 1]][j] == 1 && !visited[j])// 棧頂元素為1,且未被訪問 { bottom = false;// 標記為不是最深 break; } j++; } if (!bottom)// 不是最深 { stack[size++] = j;// 加入棧 f(j); visited[j] = true;// 標記為已訪問過 } else// 是最深 { size--;// 彈棧頂 } } } void print(int v) { printf("%d\n", v); } int main() { // 有向圖,不一定全部遍歷 //bool adjmatrix[][N] = //{ // 0, 0, 1, 0, 1, 1, // 0, 0, 1, 0, 0, 0, // 0, 0, 0, 1, 0, 0, // 0, 0, 0, 0, 0, 1, // 0, 0, 0, 1, 0, 1, // 0, 0, 0, 0, 0, 0 //}; // 無向圖 bool adjmatrix[][N] = { 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0 }; DFS_Traverse(adjmatrix, 0, print); return 0; }