データ構造_7:図アルゴリズム:図の遍歴

7554 ワード

DFS-深さ優先ループ
  • は、
  • を順次巡回するのと同様である.
  • 受領表マトリクス方式
  • typedef int Boolean; 
    Boolean visited[MAX];  //       
    
    //             
    void DFS(MGraph G,int i)
    {
        int j;
        visited[i]=TRUE;
        printf("%c",G.vexs[i]); //    ,
        for(j=0;j<G.numVertextes;j++)
          if(G.arc[i][j]==1 && !visited[j])
              DFS(G,j);  //        DFS
    }
    
    void DFSTraverse(MGraph G)
    {
        int i;
        for(i=0;i<G.numVertexes;i++)
           visited[i]=FALSE;  //            
        for(i=0;i<G.numVertexes;i++)
           if(!visited[i])  //          DFS,      ,       。
             DFS (G,i);
    }
  • 受領表DFS
  • void DFS(GraphAdjList GL, int i)
    {
        EdgeNode *p;
        visited[i] = TRUE;
        printf("%c ",GL->adjList[i].data);/*     ,        */
        p = GL->adjList[i].firstedge;
        while(p)
        {
            if(!visited[p->adjvex])
                DFS(GL, p->adjvex);/*               */
            p = p->next;
        }
    }
    
    /*            */
    void DFSTraverse(GraphAdjList GL)
    {
        int i;
        for(i = 0; i < GL->numVertexes; i++)
            visited[i] = FALSE; /*                  */
        for(i = 0; i < GL->numVertexes; i++)
            if(!visited[i]) /*           DFS,     ,       */ 
                DFS(GL, i);
    }
    

    広さ優先ループ
  • ツリーに似た階層
  • 隣接行列のBFS
  • /*             */
    void BFSTraverse(MGraph G)
    {
        int i, j;
        Queue Q;
        for(i = 0; i < G.numVertexes; i++)
            visited[i] = FALSE;
        InitQueue(&Q);      /*            */
        for(i = 0; i < G.numVertexes; i++)  /*           */
        {
            if (!visited[i])    /*           */
            {
                visited[i]=TRUE;        /*           */
                printf("%c ", G.vexs[i]);/*     ,        */
                EnQueue(&Q,i);      /*         */
                while(!QueueEmpty(Q))   /*          */
                {
                    DeQueue(&Q,&i); /*         ,   i */
                    for(j=0;j<G.numVertexes;j++) 
                    { 
                        /*                      */
                        if(G.arc[i][j] == 1 && !visited[j]) 
                        { 
                            visited[j]=TRUE;            /*               */
                            printf("%c ", G.vexs[j]);   /*      */
                            EnQueue(&Q,j);              /*            */
                        } 
                    } 
                }
            }
        }
    }
  • 受領表BFS
  • void BFSTraverse(GraphAdjList GL)
    {
        int i;
        EdgeNode *p;
        Queue Q;
        for(i = 0; i < GL->numVertexes; i++)
            visited[i] = FALSE;
        InitQueue(&Q);
        for(i = 0; i < GL->numVertexes; i++)
        {
            if (!visited[i])
            {
                visited[i]=TRUE;
                printf("%c ",GL->adjList[i].data);/*     ,        */
                EnQueue(&Q,i);
                while(!QueueEmpty(Q))
                {
                    DeQueue(&Q,&i);
                    p = GL->adjList[i].firstedge;   /*                */
                    while(p)
                    {
                        if(!visited[p->adjvex]) /*          */
                        {
                            visited[p->adjvex]=TRUE;
                            printf("%c ",GL->adjList[p->adjvex].data);
                            EnQueue(&Q,p->adjvex);  /*         */
                        }
                        p = p->next;    /*            */
                    }
                }
            }
        }
    }