图的遍历

1、DFS(Depth-First-Search深度优先搜索)
从选定的顶点开始,开始递归遍历。递归的思想:标记起点,找到第一个邻接点,如果该点没标记,那么以该点为新起点进行递归。如果改点标记或者上一个邻接点递归完毕,寻找下一个邻接点重复上面过程。算法如下:

void dfs(int start, int label[])
{
    label[start] = 1; // 标记该点
    int u = findOne(start); // 找到start的一个邻接点
    while(u != -1) // 当邻接点存在时
    {
        if(label[u] == 0) // 当该邻接点未被标记时
            dfs(u, label); // 递归该点
        u = findNext(start); // 找到下一个邻接点
    }
}
// findNext() findOne()根据不同的存储结构实现方法不同。
// label[] 数组使用前需要初始化为0

2、BFS(Breadth-First-Search广度优先搜索)
需要使用到队列Queue。思想是:将指定起点加入队列,然后对队列进行循环判断,判断队列不为空。在循环内,从队列内删除一个并记录这个元素(点),找这个点的所有邻接点,将没被标记的邻接点依次加入队列,并标记加入队列的点。重复循环。之所以在加入队列的时候进行标记判断和标记,是因为当多个点有同一个邻接点时,该邻接点会被添加多次,可能会陷入死循环。

void bfs(int start, int label[])
{
    Queue *q = initQueue(); // 建议使用链表实现的队列
    q.add(start);
    while(!q.isEmpty()) // 队列不空
    {
        int v = q.del(); // 将删除的元素赋值给v
        int u = findOne(v); // 找v的邻接点
        while(u != -1) // 邻接点存在
        {
            if(label[u] == 0) // 未标记
            {
                label[u] == 1; // 标记
                q.add(u); // 入队列
            }
            u = findNext(v); // 找下一个邻接点
        }
    }
    freeQueue(q);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值