图的遍历

#ifndef GRAPH_VISIT_H
#define GRAPH_VISIT_H

#include <queue>
#include<stack>
#include<memory>
#include<limits.h>
#include"../data_struct/data_struct.h"


class graph_visit
{
public:
    /// 广度优先
    static void bfs(const std::shared_ptr<graph_matrix>& graph, std::vector<uint32_t>& out_data)
    {
        std::vector<bool> is_visited(graph->vertex.size(), false);

        for (auto i : graph->vertex)
        {
            //广度遍历未访问过的顶点
            if (!is_visited[i])
            {
                _bfs(graph,i, is_visited, out_data);
            }
        }
    }

private:
    static void _bfs(const std::shared_ptr<graph_matrix>& graph,uint32_t vertex,
                     std::vector<bool>&is_visited, std::vector<uint32_t>& out_data)
    {
        std::queue<uint32_t> que;
        que.emplace(vertex);

        //标记此顶点已经被访问
        is_visited[vertex] = true;
        out_data.emplace_back(vertex);

        //广度遍历顶点的邻接点
        while (!que.empty())
        {
            auto start = que.front();
            que.pop();
            for (auto i : graph->vertex)
            {
                if (!is_visited[i] && graph->matrix[start][i] <INT_MAX)
                {
                    is_visited[i] = true;

                    que.emplace(i);
                    out_data.emplace_back(i);
                }
            }
        }
    }

public:
    /// 深度优先
    static void dfs_r(const std::shared_ptr<graph_matrix>& graph, std::vector<uint32_t>& out_data)
    {
        std::vector<bool> is_visited(graph->vertex.size(), false);

        for (auto i : graph->vertex)
        {
            //广度遍历未访问过的顶点
            if (!is_visited[i])
            {
                _dfs_r(graph, i,  is_visited, out_data);
            }
        }
    }

private:
    static  void _dfs_r(const std::shared_ptr<graph_matrix>& graph,uint32_t vertex,
                      std::vector<bool>&is_visited, std::vector<uint32_t>& out_data)
    {
        out_data.emplace_back(vertex);

        //标记为已访问
        is_visited[vertex] = true;
        for (auto i : graph->vertex)
        {
            if (is_visited[i] == false && graph->matrix[vertex][i] <INT_MAX)
            {
                //深度递归
                _dfs_r(graph, i, is_visited, out_data);
            }
        }
    }

public:
    /// 深度优先非递归
    static void dfs(const std::shared_ptr<graph_matrix>& graph, std::vector<uint32_t>& out_data)
    {
        std::vector<bool> is_visited(graph->vertex.size(), false);

        for (auto i : graph->vertex)
        {
            //广度遍历未访问过的顶点
            if (!is_visited[i])
            {
                _dfs(graph, i, is_visited, out_data);
            }
        }
    }

private:
    static void _dfs(const std::shared_ptr<graph_matrix>& graph,uint32_t vertex,
                            std::vector<bool>&is_visited, std::vector<uint32_t>& out_data)
    {
        out_data.emplace_back(vertex);
        is_visited[vertex] = true;

        std::stack<uint32_t> stack;
        stack.push(vertex);
        while (stack.size() != 0)
        {
            bool is_no_adj = true;//邻接点都已经访问完了 或者没有邻接点了
            auto v = stack.top();
            for (auto i : graph->vertex)
            {
                if (is_visited[i] == false && graph->matrix[v][i] <INT_MAX)
                {
                    out_data.push_back(i);
                    is_visited[i] = true;
                    stack.push(i);
                    is_no_adj = false;
                    break;
                }
            }

            if (is_no_adj)
            {
                stack.pop();
            }
        }
    }
};

#endif // GRAPH_VISIT_H

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值