06-图1 列出连通集

广度优先搜索与深度优先搜索

广度优先搜索

此处举一个特例,用

#include "0_.h"
void BFS(MGraph G)
{
    int v, w, i;
    Queue Q;
    for (i = 0; i < MaxVertexNum; i++) {
        Visited[i] = 0;
    }
    Q = CreatQueue();
    for (i = 0; i < G->nv; i++) {
        if (Visited[i] == 0) {
            printf("{ ");
            Visited[i] = 1;
            printf("%d ", i);
            EnQueue(Q, i);
            while (!IsEmptyQ(Q)) {
                v = DeQueue(Q);
                /*********************************/
                for (w = 0; w < G->nv; w++) {
                    if (!Visited[w] && G->Edge[v][w]) {
                        Visited[w] = 1;
                        printf("%d ", w);
                        EnQueue(Q, w);
                    }
                }
                /*********************************/
            }
            printf("}");
            if (!FinishVisit(G))
                printf("\n");
        }
    }
    return;
}

注释包裹处可替换为下列代码的思路,更具有一般性

w = 0;
/* v为给定的第一个点,先找到v的邻接点,将其入队 */
for (w = FirstAdjV(G, v, w); w < G->nv; w = NextAdjV(G, v, w)) {
    if (!Visited[w]) {
        Visited[w] = 1;
        printf("%d ", w);
        EnQueue(Q, w);
    } else
        break;
}

Vertex FirstAdjV(MGraph G, Vertex v, Vertex w)
{
    int i;
    for (i = w; i < G->nv; i++) {
        if (!Visited[i] && G->Edge[v][i])
            break;
    }
    return i;
}

Vertex NextAdjV(MGraph G, Vertex v, Vertex w)
{
    return FirstAdjV(G, v, w);
}

深度优先搜索

for (i = 0; i < G->nv; i++) {
    if (!Visited[i]) {
        printf("{ ");
        DFS(G, i);
        printf("}\n");
    }
}

void DFS(MGraph G, Vertex v)
{
    int w;
    printf("%d ", v);
    Visited[v] = 1;
    for (w = 0; w < G->nv; w++) {
        if (!Visited[w] && G->Edge[v][w]) {
            DFS(G, w);
        }
    }
}

你可能感兴趣的:(06-图1 列出连通集)