数据结构 _ 基础练习 _ 7-6 列出连通集

原题

点此链接1

题目分析

题目考察的就是建图和图的搜索(DFS与BFS)两块内容,值得分析的是可以尝试使用非递归DFS来实现这个问题。

代码

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <algorithm>
#include <stack>
#include <list>

using namespace std;
using std::cout;

void dfs(vector<vector<int>> &data, int &v, vector<bool> &vis)
{
    vis[v] = true;
    cout << v << " ";
    for (auto r : data[v])
    {
        if (vis[r])
            continue;

        dfs(data, r, vis);
    }
}

int main()
{
    vector<vector<int>> data;

    int n, e;
    cin >> n >> e;

    data.resize(n);

    for (auto i = 0; i < e; i++)
    {
        int a, b;
        cin >> a >> b;
        data[a].push_back(b);
        data[b].push_back(a);
    }
    for (auto i = 0; i < n; i++)
        sort(data[i].begin(), data[i].end(), [](int l, int r) { return l < r; });

    // DFS
    {
        vector<bool> visited(n, false); // false not, true yes
        for (auto i = 0; i < n; i++)
        {
            if (visited[i])
                continue;
            std::cout << "{ ";
            
            // The recursive implementation
            // dfs(data, i, visited);
            
            // The non recursive implementation
			{
                list<int> lis;
                lis.push_back(i);
                visited[i] = true;
                while (!lis.empty())
                {
                    auto node = lis.back();
                    lis.pop_back();
                    std::cout << node << " ";
                    visited[node] = true;
                    for (auto iter = data[node].rbegin(); iter != data[node].rend(); ++iter)
                    {
                        auto r = *iter;
                        if (visited[r])
                            continue;
                        lis.remove(r);
                        lis.push_back(r);
                    }
                }
            }
            std::cout << "}" << endl;
        }
    }

    // BFS
    {
        vector<bool> visited(n, false); // false not, true yes
        for (auto i = 0; i < n; i++)
        {
            if (visited[i])
                continue;

            visited[i] = true;
            queue<int> que;
            que.push(i);
            cout << "{ ";
            cout << i << " ";
            while (!que.empty())
            {
                auto node = que.front();
                que.pop();
                for (auto r : data[node])
                {
                    if (visited[r])
                        continue;

                    visited[r] = true;
                    que.push(r);
                    cout << r << " ";
                }
            }
            cout << "}" << endl;
        }
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值