图的深度优先搜索遍历DFS和广度优先搜索遍历BFS——C/C++

#define MAXSIZE 8

//邻接表结构
typedef struct ArcNode{
    int adjvex;        //该边所指向的结点编号
    struct ArcNode *nextarc;    //指向下一条边的指针
    int info;            //该边的相关信息,权值等
}ArcNode;
typedef struct{
    char data;    //顶点的相关信息
    ArcNode *firstarc;        //指向第一条边的指针
}VNode;
typedef struct{
    VNode adjlist[MAXSIZE];    //顶点
    int n,e;    //顶点数和边数
}AGraph;

//对顶点v的操作函数
void Visit(int v)
{    
    cout<<" "<<v;
}


//深度优先搜索遍历DFS    deepth first search
int visit[MAXSIZE];        //全局标记数组
void DFS(AGraph *G,int v)    //v为起点
{
  /*int i;
    for(i=0;i<G->n;i++)        
        visit[i] = 0;        //初始化为0代表顶点未被访问
  */
    ArcNode *p;
    visit[v] = 1;
    Visit(v);
    p = G->adjlist[v].firstarc;        //p指向顶点v的第一条边
    while(p!=NULL){
        if(visit[p->adjvex]==0)    //若顶点未被访问,则递归访问它
            DFS(G,p->adjvex);
        p = p->nextarc;        //p指向v的下一条边
    }
}
//非连通图的深度优先遍历
void dfs(AGraph *G)
{
    int i;
    for(i=0;i<G->n;i++)        //初始化为0代表顶点未被访问
        visit[i] = 0;

    for(i=0;i<G->n;i++)
        if(visit[i]==0)
            DFS(G,i);
}



//广度优先搜索遍历BFS  broad first search
void BFS(AGraph *G,int v)
{
    int i;
  /*for(i=0;i<G->n;i++)    
        visit[i] = 0;        //初始化为0代表顶点未被访问
  */
    ArcNode *p;
    int que[MAXSIZE],front = 0,rear = 0;    //循环队列 
    Visit(v);
    visit[v] = 1;

    rear = (rear+1)%MAXSIZE;    //当前顶点入队
    que[rear]  = v;

    while(front!=rear){        //队空循环退出时代表遍历完成
        front = (front+1)%MAXSIZE;        //顶点出队
        i = que[front];
        p = G->adjlist[i].firstarc;
        //将该顶点的所有邻接顶点入队
        while(p!=NULL){
            if(visit[p->adjvex]==0){
                Visit(p->adjvex);
                visit[p->adjvex] = 1;
                rear = (rear+1)%MAXSIZE;
                que[rear] = p->adjvex;
            }
            p = p->nextarc;
        }
    }
}
//非连通图的广度优先遍历
void bfs(AGraph *G)    
{
    int i;
    for(i=0;i<G->n;i++)      //初始化为0代表顶点未被访问    
        visit[i] = 0;

    for(i=0;i<G->n;i++)
        if(visit[i]==0)
            BFS(G,i);
}

猜你喜欢

转载自www.cnblogs.com/daemon94011/p/8944709.html