• 图的DFS与BFS


    1.DFS

    深度优先搜索在搜索过程中访问某个顶点后,需要递归地访问此顶点的所有未访问过的相邻顶点。

    (1)递归实现

    #include <iostream>
    #define N 5
    using namespace std;
    int maze[N][N] = {
        { 0, 1, 1, 0, 0 },
        { 0, 0, 1, 0, 1 },
        { 0, 0, 1, 0, 0 },
        { 1, 1, 0, 0, 1 },
        { 0, 0, 1, 0, 0 }
    };
    int visited[N + 1] = {0};
    void DFS(int start)
    {
        visited[start] = 1;
      cout<<start<<' ';
    for (int i = 1; i <= N; i++) { if (!visited[i] && maze[start - 1][i - 1] == 1) DFS(i); } } int main() { for (int i = 1; i <= N; i++) { if (visited[i] == 1) continue; DFS(i); } return 0; }

    (2)也可以用非递归实现,借助于栈的数据结构

    #include <iostream>
    #include <stack>
    #define N 5
    using namespace std;
    int maze[N][N] = {
        { 0, 1, 1, 0, 0 },
        { 0, 0, 1, 0, 1 },
        { 0, 0, 1, 0, 0 },
        { 1, 1, 0, 0, 1 },
        { 0, 0, 1, 0, 0 }
    };
    int visited[N + 1] = {0};
    void DFS(int start)
    {
        stack<int> s;
        s.push(start);
        visited[start] = 1;
        while (!s.empty())
        {
            int v = s.top();
            cout<<v<<' ';
            s.pop();
            for (int i = 1; i <= N; i++)
            {
                if (maze[v - 1][i - 1] == 1 && !visited[i])
                {
                    visited[i] = 1;
                    s.push(i);
                }
            }
        }
    }
    int main()
    {
        for (int i = 1; i <= N; i++)
        {
            if (visited[i] == 1)
                continue;
            DFS(i);
        }
        return 0;
    }

    其中visited代表着每个节点是否被访问,一般定义成全局的数组。也有将visited定义为局部的数组,作为函数参数引用传递的。

    2、BFS

    广度优先搜索在进一步遍历图中顶点之前,先访问当前顶点的所有邻接结点。

    #include <iostream>
    #include <queue>
    #define N 5
    using namespace std;
    int maze[N][N] = {
        { 0, 1, 1, 0, 0 },
        { 0, 0, 1, 1, 0 },
        { 0, 1, 1, 1, 0 },
        { 1, 0, 0, 0, 0 },
        { 0, 0, 1, 1, 0 }
    };
    int visited[N + 1] = { 0, };
    void BFS(int start)
    {
        queue<int> Q;
        Q.push(start);
        visited[start] = 1;
        while (!Q.empty())
        {
            int front = Q.front();
            cout << front << " ";
            Q.pop();
            for (int i = 1; i <= N; i++)
            {
                if (!visited[i] && maze[front - 1][i - 1] == 1)
                {
                    visited[i] = 1;
                    Q.push(i);
                }
            }
        }
    }
    int main()
    {
        for (int i = 1; i <= N; i++)
        {
            if (visited[i] == 1)
                continue;
            BFS(i);
        }
        return 0;
    }
  • 相关阅读:
    II、Python HelloWorld
    初次比较正式的IT职场面试后几点对自己web开发的思考
    网页调用迅雷下载文件
    php PAC 安装
    php 大文件上传的实现
    正则表达式
    怎么看待php 面向对象思想
    IT职场初体验一
    php 发送邮件
    web的seo
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9484503.html
Copyright © 2020-2023  润新知