列出连通集-PTA dfs bfs

题目连接

dfs

根据一个点 的邻接点把与这个点相连的点全部找到
每发现一个没走过的点 直接就走 一直到无点可走为止

bfs

bfs是分层的 第一个给的点就是第一层 第一个点能走的点是第二层
第二层的点能走的点即是第三层… 一直到全部走完
bfs利用队列(queue)来实现 将要走的点在队列里面 现在正在走的点是队列的第一个点 如果要走 就先出列(即 拿出来付给一个变量 并且把它从队列里删去)
然后就看这个点的邻接点 把这个点的邻接点依次放到队列的后面 之后再依次拿出 当队列里没有的时候也就是点已经全部走完了

注释挺详细

不懂请留言

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
vector<vector<int>> x;
vector<int> dp; //标记
void dfs(int d)
{
    //d是正在走的点 把d标记为已走
    dp[d] = 1;
    cout << d << ' ';
    //看谁和点d连接
    for (auto a : x[d])
    {
        //如果d连接的点a没有走 那么走就完事了
        if (!dp[a])
            dfs(a);
    }
}
void bfs(int t)
{
    queue<int> q;
    //添加一个起始点
    q.push(t);
    dp[t] = 1;
    while (!q.empty())
    {
        //拿出队列的第一个点
        int tp = q.front();
        //出列
        q.pop();
        //出列就代表走这个点
        cout << tp << " ";
        for (auto e : x[tp])
        {
            //把tp点的下一层的节点放到队列里
            if (!dp[e])
            {
                q.push(e);
                dp[e] = 1;
            }
        }
    }
}
int main()
{
    int n, m;
    cin >> n >> m;
    //开大小 有n个节点
    x.resize(n);
    dp.resize(n);
    //填充0
    fill(dp.begin(), dp.end(), 0);
    //邻接点存图
    for (int i = 0; i < m; i++)
    {
        int a, b;
        cin >> a >> b;
        x[a].push_back(b);
        x[b].push_back(a);
    }
    // cout << endl;
    for (int i = 0; i < n; i++)
    {
        //给每一个节点排序
        sort(x[i].begin(), x[i].end());
        /*****************************
        //每个点的链接情况
        cout << i << ": ";
        for (auto t : x[i])
        {
            cout << t << ' ';
        }
        cout << endl;
        *****************************/
    }
    // cout << endl;
    for (int i = 0; i < n; i++)
    {
        //加上if 是因为那些连在一起的点就不用再去走了
        if (!dp[i])
        {
            cout << "{ ";
            dfs(i);
            cout << "}";
            cout << endl;
        }
    }
    //因为上面已经改变了 重新填充
    fill(dp.begin(), dp.end(), 0);
    for (int i = 0; i < n; i++)
    {
        if (!dp[i])
        {
            cout << "{ ";
            bfs(i);
            cout << "}";
            cout << endl;
        }
    }
    return 0;
}

fill 函数用法

发布了51 篇原创文章 · 获赞 16 · 访问量 3476
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 岁月 设计师: pinMode

分享到微信朋友圈

×

扫一扫,手机浏览