深度优先搜索 (DFS)

某无向图如下:

#include <stdio.h>

// 邻接矩阵 
typedef struct {
    char vexs[20];  // 顶点存储数据 
    int matrix[20][20];  // 邻接矩阵
    int vexNum, arcNum;  // 顶点数  弧数 
} MatrixGraph;

int visited[20];  // 是否被访问过 

void DFS(MatrixGraph &graph, int i);
void DFS_UG(MatrixGraph &graph);

/**input:
7 8
abcdefg
3 5
4 3
5 4
0 2
1 0
0 6
6 4
0 5
*/
int main() {
    MatrixGraph graph;
    
    // 图的顶点数和弧数 
    scanf("%d%d", &graph.vexNum, &graph.arcNum); 
    getchar();
    // 图的顶点所代表的数据 
    for(int i=0; i<graph.vexNum; i++) {
        scanf("%c", &graph.vexs[i]);
    }
    // 邻接矩阵初始化(置无限大) 
    for(int i=0; i<graph.vexNum; i++) {
        for(int j=0; j<graph.vexNum; j++) {
            graph.matrix[i][j] = 0x7fffffff;
        }
    }
    
    for(int i=0; i<graph.arcNum; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        // 无向图 
        graph.matrix[a][b] = 1;
        graph.matrix[b][a] = 1;
    }
    
    DFS_UG(graph);
}

void DFS(MatrixGraph &graph, int i) {
    visited[i] = 1;
    printf("%c ", graph.vexs[i]);
    
    for(int j=0; j<graph.vexNum; j++) {
        if(graph.matrix[i][j]==1 && !visited[j]) {
            DFS(graph, j);
        }
    }
}

void DFS_UG(MatrixGraph &graph) {
    for(int i=0; i<graph.vexNum; i++) {
        visited[i] = 0;
    }
    
    printf("深度优先搜索结果:\n");
    for(int i=0; i<graph.vexNum; i++) {
        if(!visited[i]) {
            DFS(graph, i);
        }
    }
}

 

posted @ 2022-04-26 23:31  HanselHuang  阅读(77)  评论(0编辑  收藏  举报