美文网首页
06-图1 列出连通集

06-图1 列出连通集

作者: lucas_cc | 来源:发表于2018-05-04 16:13 被阅读0次

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

    广度优先搜索

    此处举一个特例,用

    #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 列出连通集

          本文链接:https://www.haomeiwen.com/subject/njnjlftx.html