首页 > 代码库 > 数据结构-6-深度广度遍历搜索原理详解

数据结构-6-深度广度遍历搜索原理详解

深度广度遍历搜索的定义想必大家都能熟练的掌握了,下面我就通过一个图的实例,把应用的代码直接贴上供大家参考,以后可以直接借鉴或者使用。

#include <iostream>   

#include <string>   

#include "Queue.h"   

using namespace std;  

//图的邻接矩阵存储表示   

#define INFINITY INT_MAX   

#define MAX_VERTEX_NUM 20   

typedef enum {DG, DN, UDG, UDN} GraphKind; //{有向图,有向网,无向图,无向网  

typedef enum {OK, ERROR} Status;  

typedef struct ArcCell{  

    int adj;        //顶点关系类型。对于无权图,用01表示相邻否。对于有权图,则为权值类型。   

    string info;    //该弧所携带的信息   

}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  

typedef struct {  

    int vexs[MAX_VERTEX_NUM];   //顶点向量   

    AdjMatrix arcs;             //邻接矩阵   

    int vexnum, arcnum;         //图的当前顶点数和弧数   

    GraphKind kind;             //图的种类标志   

}MGraph;  

bool visited[MAX_VERTEX_NUM];   //设访问标志数组,供遍历时使用  

 

 

2. 构造测试用的建立无向图的函数

[cpp] view plaincopyprint?

void CreateUDGTest(MGraph &G)  

{   //构造一个测试用的无向图   

    int i,j;  

    //数组a[9][2]包含所有边   

    //int a[9][2] = {0,1,0,2,0,3,1,4,1,5,4,5,7,8,8,9,9,7};   

    int a[9][2] = { {0,1}, {0,2}, {0,3}, {1,4}, {1,5}, {4,5}, {7,8}, {8,9}, {9,7}};  

    G.kind = UDG;  

    G.vexnum = 10;  

    G.arcnum = 9;  

    for(i=0; i<G.vexnum; ++i)        //构造顶点向量   

        G.vexs[i] = i;  

    for(i=0; i<G.vexnum; ++i)        //初始化为全  

        for(j=0; j<G.vexnum; ++j)  

            G.arcs[i][j].adj = 0;         

    for(i=0; i<G.arcnum; ++i)        //对存在的边赋值  

        G.arcs[a[i][0]][a[i][1]].adj = G.arcs[a[i][1]][a[i][0]].adj = 1;  

}   

 

3. 深度优先遍历和广度优先遍历函数

void DFSTraverse(MGraph G)  

{   //对图G作深度优先遍历   

    int v;  

    for(v=0; v<G.vexnum; ++v)    //访问标志数组初始化   

        visited[v] = false;  

    for(v=0; v<G.vexnum; ++v)  

        if(!visited[v])         //对未访问的顶点调用DFS   

            DFS(G, v);  

}  

void DFS(MGraph G, int v)  

{   //从第v个顶点出发,递归地深度优先遍历图  

    int w;  

    visited[v] = true;  

    VisitFunc(v);               //访问第v个顶点   

    for(w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G, v, w))  

        if(!visited[w])  

            DFS(G, w);          //v的尚未访问的邻接顶点w递归调用DFS   

}  

void BFSTraverse(MGraph G)  

{  

    //按广度优先非递归地遍历图G。使用辅助队列Q和访问标志数组visited   

    int v, w, u;  

    LinkQueue Q;  

    for(v=0; v<G.vexnum; ++v)    //访问标志数组初始化   

        visited[v] = false;  

    InitQueue(Q);               //置空的辅助队列   

    for(v=0; v<G.vexnum; ++v)  

        if(!visited[v])  

        {  

            visited[v] = true;  

            VisitFunc(v);  

            EnQueue(Q,v);  

            while(QueueEmpty(Q) == FALSE){  

                DeQueue(Q, u);  //对头元素出队,并置为  

                for(w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G, v, w))  

                    if(!visited[w]){    //wu未访问的邻接顶点   

                        visited[w] = true;  

                        VisitFunc(w);  

                        EnQueue(Q, w);  

                    }  

            }  

        }//if   

}//BFSTraverse   

void VisitFunc(int v)  

{   //访问第v个节点   

    cout<<v<<endl;  

}  

int FirstAdjVex(MGraph G, int v)  

{   //返回节点v的第一个邻接顶点   

    int i;  

    for(i=0; i<G.vexnum; ++i)  

        if(G.arcs[v][i].adj != 0 && i!=v)  

            return i;  

    return -1;          //如果没有,返回-1   

}  

int NextAdjVex(MGraph G, int v, int w)  

{  

    //返回节点v的邻接顶点中w之后的下一个邻接顶点   

    int i;  

    for(i=w+1; i<G.vexnum; ++i)  

        if(G.arcs[v][i].adj != 0 && i!=v)  

            return i;  

    return -1;          //如果没有,返回-1   

}   

 

4. 主函数-测试用

int main()  

{  

    MGraph gra;  

    CreateUDGTest(gra);             //构造无向图  

    cout<<"对无向图G作深度优先遍历:"<<endl;  

    DFSTraverse(gra);               //对无向图G作深度优先遍历   

    cout<<"对无向图G作广度优先遍历:"<<endl;  

    BFSTraverse(gra);  

    return 0;  

}  

数据结构-6-深度广度遍历搜索原理详解