以Day9的邻接矩阵为例

1. 深度优先搜索(DFS)

void DFSTraverse(MatrixGraph *mg)      // DFS启动算法
{
    int *visited = malloc(sizeof(int) * mg->vexNum);
    memset(visited, 0, sizeof(int) * mg->vexNum);
    for(int i = 0;i < mg->vexNum;i++)
        if(visited[i] == 0)
            DFS(mg, i, visited);
    putchar('\n');
}

void DFS(MatrixGraph *mg, int v, int visited[])       // DFS局部搜索
{
    printf("%d ", v);
    visited[v] = 1;
    // 遍历u的每一个邻接点
    for(int w = MatrixGraphLocateVex(mg, MatrixGraphFirstAdjVex(mg, mg->vexs[v]));w >= 0;w = MatrixGraphLocateVex(mg, MatrixGraphNextAdjVex(mg, mg->vexs[v], mg->vexs[w]))) {
        if(visited[w] == 0)
            DFS(mg, w, visited);
    }
}

2. 广度优先搜索(BFS)

void BFSTraverse(MatrixGraph *mg)      // BFS启动算法
{
    int *visited = malloc(sizeof(int) * mg->vexNum);
    memset(visited, 0, sizeof(int) * mg->vexNum);
    for(int i = 0;i < mg->vexNum;i++)
        if(visited[i] == 0)
            BFS(mg, i, visited);
}

void BFS(MatrixGraph *mg, int v, int visited[])       // BFS局部搜索
{
    LinkQueue *lq = malloc(sizeof(LinkQueue));
    LinkQueueInit(lq);
    printf("%d ", v);                           // 输出作为visit语句,也可替换为其它函数
    visited[v] = 1;
    LinkQueueEnQueue(lq, v);
    while(LinkQueueEmpty(lq) < 0) {
        int u = -1;
        LinkQueueDeQueue(lq, &u);
        // 遍历u的每一个邻接点
        for(int w = MatrixGraphLocateVex(mg, MatrixGraphFirstAdjVex(mg, mg->vexs[u]));w >= 0;w = MatrixGraphLocateVex(mg, MatrixGraphNextAdjVex(mg, mg->vexs[u], mg->vexs[w]))) {
            if(visited[w] == 0) {
                visited[w] = 1;
                printf("%d ", w);
                LinkQueueEnQueue(lq, w);
            }
        }
    }
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐