图的遍历(哈喜老师)

1.深度优先搜索(DFS)

1.1:连通图的DFS的步骤

1.2:非连通图采用邻接矩阵存储时的DFS的代码(对于连通图也适用)

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define Max_Vertex_Num 20
typedef char VertexType;

typedef struct {
    int vexnum, arcnum;
    VertexType vexs[Max_Vertex_Num];
    int edges[Max_Vertex_Num][Max_Vertex_Num];
} MGraph;

bool visited[Max_Vertex_Num];

// DFS 函数(不变)
void DFS(MGraph G, int v) {
    printf("%c ", G.vexs[v]);
    visited[v] = true;

    for (int w = 0; w < G.vexnum; w++) {
        if (G.edges[v][w] == 1 && !visited[w]) {
            DFS(G, w);
        }
    }
}

//  遍历非连通图(关键函数!)
void DFSTraverse(MGraph G) {
    // 初始化所有标记为 false
    memset(visited, 0, sizeof(visited));

    // 对每个顶点,如果没被访问过,就开始一次DFS
    for (int v = 0; v < G.vexnum; v++) {
        if (!visited[v]) {
            DFS(G, v);
        }
    }
}

// 创建图(不变)
void CreateMGraph(MGraph *G) {
    int i, j, k;
    printf("请输入顶点数和边数:");
    scanf("%d%d", &G->vexnum, &G->arcnum);
    getchar();

    for (i = 0; i < G->vexnum; i++) {
        printf("请输入第%d个顶点的值:", i + 1);
        scanf("%c", &G->vexs[i]);
        getchar();
    }

    memset(G->edges, 0, sizeof(G->edges));

    for (k = 0; k < G->arcnum; k++) {
        printf("请输入边(vi,vj)的下标i,j:");
        scanf("%d%d", &i, &j);
        G->edges[i][j] = 1;
        G->edges[j][i] = 1;
    }
}

int main() {
    MGraph G;
    CreateMGraph(&G);

    printf("\n深度优先遍历序列(支持非连通图):");
    DFSTraverse(G);   
    printf("\n");

    return 0;
}

1.2.1:两组测试案例

cpp 复制代码
// 第一组测试案例(连通图)
// 输入:
5 3
A
B
C
D
E
0 1
1 2
3 4
// 预期输出
A B C D E


//
第一组测试案例(非连通图)
顶点:A B C D E
其中:
A-B-C 连通
D-E 连通 
共两个连通分量,互不相连
5 3
A
B
C
D
E
0 1
1 2
3 4
// 预期输出:A B C D E

结论:(重要)

DFSTraverse函数中调用DFS函数的次数,就是该非连通图中连通分量的个数

1.3:非连通图采用邻接表存储时的DFS的代码

2.广度优先搜索(BFS)

相关推荐
inrichtt1 小时前
第十一课时:串口中断接收与回调函数实战解析
c语言·数据结构·stm32·单片机·嵌入式硬件
?abc!2 小时前
(动态规划+DFS)494. 目标和
算法·深度优先·动态规划
信奥卷王2 小时前
[GESP202406 六级] 二叉树(含视频)
数据结构·算法
惊鸿一博2 小时前
Plücker直线_ 用两个三维向量描述一条空间直线
线性代数·算法·直线·几何表示
小道士写程序2 小时前
Rust 中的字符串与切片(String 与 &str)
算法
Tisfy3 小时前
LeetCode 3863.将一个字符串排序的最小操作次数:分类讨论(一次遍历)——简单易懂版
算法·leetcode·字符串·题解·分类讨论
Young Doro3 小时前
从平衡表征到最小充分因果表征:端到端神经网络因果效应估计
算法
0+1113 小时前
算法 --递归
算法·leetcode
打工仔折腾 AI3 小时前
介入式脑机接口的跨尺度解码与闭环调控:从算法落地到后端工程实践
人工智能·后端·python·深度学习·算法·ai agent 实战
凤山老林4 小时前
授权模型只会RBAC?深入 ABAC 授权模型,实现权限判断做成策略引擎
大数据·数据库·算法