DFS BFS 算法 图的遍历

DFS算法---递归实现

 

有图如下所示:

得表如下所示:

 

  01234567
  abcdefgh
0a01110000
1b10000000
2c10001100
3d10000101
4e00100100
5f00111010
6g00000101
7h00010010

 

上代码:

#include "iostream"
#include "memory.h"

int Graph[8][8] = {0};
int isVisited[8] = {0};

int arcArr[10][2] = 
{
    {1, 0},
    {2, 0},
    {3, 0},
    {4, 2},
    {5, 2},
    {5, 3},
    {5, 4},
    {6, 5},
    {7, 3},
    {7, 6}
};

void DFS_Graph( int (*G)[8], int n)
{
    std::cout << n << " ";
    isVisited[n] = 1;
    for(int scanCount = 0; scanCount < 8; scanCount++)
    {
        if(G[n][scanCount] == 1 && isVisited[scanCount] == 0)
        {
            int tempCount = scanCount;
            DFS_Graph(G, tempCount);
        }
    }
}

void init_Graph(void)
{
    int j = 0;
    for(int i = 0; i < 8; i++)
    {  
        while(arcArr[j][0] == i)
        {
            Graph[i][arcArr[j][1]] = 1;
            Graph[arcArr[j][1]][i] = 1;
            j++;
        }
    }
    for(int i = 0; i < 8; i++)
    {
        for(int j = 0; j < 8; j++)
        {
            std::cout << Graph[i][j] << "  ";
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
}

void dfs_Test(void)
{
    init_Graph();
    for(int i = 0; i < 8; i++)
    {
        DFS_Graph(Graph, i);
        memset(isVisited, 0, sizeof(isVisited));
        std::cout << std::endl;
    }
}

运行结果如下所示:

下面是图的广度优先遍历:

同样是这个图,我们需要用队列的方式来完成广度遍历,下面上示例代码:

int arcArr[10][2] = 
{
    {1, 0},
    {2, 0},
    {3, 0},
    {4, 2},
    {5, 2},
    {5, 3},
    {5, 4},
    {6, 5},
    {7, 3},
    {7, 6}
};

typedef struct 
{
    int  QuArr[50];
    uint8_t rear;
    uint8_t head;
}UsrQuene;

typedef struct 
{
   int GraphArr[8][8];
   int isVisited[8];
   int numVetex, numArc;
}GraphA;

void initGraphA(GraphA *GrA, UsrQuene *QueA)
{
    GrA->numVetex = 8;
    GrA->numArc = 10;
    memset(GrA->isVisited, 0, 8*sizeof(int));
    int j = 0;
    memset(GrA->GraphArr, 0, 64 * sizeof(int));
    for(int i = 0; i < GrA->numVetex; i++)
    {    
        while(i == arcArr[j][0])
        {
            GrA->GraphArr[i][arcArr[j][1]] = 1;
            GrA->GraphArr[arcArr[j][1]][i] = 1;
            j++;
        }
    }
    for(int i = 0; i < 8; i++)
    {
        for(int j = 0; j < 8; j++)
        {
            std::cout << GrA->GraphArr[i][j] << "  ";
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
    QueA->rear = QueA->head = 1;
    memset(QueA->QuArr, 0, 50 * sizeof(int));
}

int QueEmpty(UsrQuene *Q)
{
    if(Q->head == Q->rear)
    {
        return 1;
    }
    return 0;
}

int QueFull(UsrQuene *Q)
{
    if(Q->rear == 49)
    {
        return 1;
    }
    return 0;
}

int pushUsrQue(UsrQuene *Q, int e)
{
    if(QueFull(Q))
    {
        return 0;
    }
    Q->QuArr[Q->rear] = e;
    Q->rear++;
    return 1;
}

int pullUsrQue(UsrQuene *Q, int *e)
{
    if(QueEmpty(Q))
    {
        return 0;
    }
    *e = Q->QuArr[Q->head];
    Q->head++;
    return 1;
}

void BFS_Graph(GraphA *G, UsrQuene *Q, int i)
{
    //G->isVisited[i] = 1;
    //std::cout << i << " ";
    pushUsrQue(Q, i);
    G->isVisited[i] = 1;
    int eleTemp = 0;
    while(!QueEmpty(Q))
    {
        //G->isVisited[Q->QuArr[Q->head]] = 1;
        pullUsrQue(Q, &eleTemp);
        std::cout << eleTemp << " ";
        for(int i = 0; i < G->numVetex; i++)
        {
            if(G->GraphArr[eleTemp][i] != 0 && G->isVisited[i] == 0)
            {
                pushUsrQue(Q, i);
                G->isVisited[i] = 1;
            }
        }
    }
}

void bfs_Test(void)
{
    GraphA G;
    UsrQuene Q;
    initGraphA(&G, &Q);
    for (int i = 0; i < 8; i++)
    {
       BFS_Graph(&G, &Q, i);
       memset(G.isVisited, 0 , 8 * sizeof(int));
       memset(Q.QuArr, 0, 50 * sizeof(int));
       Q.head = Q.rear = 0;
       std::cout << std::endl;
    }
    
    
}

完成后结果如下图所示

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值