列出连通集

https://pta.patest.cn/pta/test/558/exam/4/question/9495


解说

这题没什么难度,只要对BFS和DFS算法中的访问代码稍作修改即可。另外需要特别注意的是,执行完一次遍历之后,需要把visited数组中的记录重置一次,不然第二次遍历没法进行。


代码

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
class Graph {
private:
    int n;
    bool *visited;
    vector<int> *edges;
public:
    Graph(int N) {
        n = N;
        visited = new bool[N];
        edges = new vector<int>[N];
        memset(visited, 0, N);
    }
    ~Graph() {
        delete[] visited;
        delete[] edges;
    }
    void insert(int a, int b) {
        edges[a].push_back(b);
        edges[b].push_back(a);
    }
    void DFS(int n) {
        cout << n << " ";
        visited[n] = true;
        sort(edges[n].begin(), edges[n].end());
        for (int vertex:edges[n])
        {
            if (!visited[vertex])
            {
                DFS(vertex);
            }
        }
    }
    void DFSprint(int n) {
        cout << "{ ";
        DFS(n);
        cout << "}" << endl;
    }
    void DFSsearch() {
        
        DFSprint(0);
        for (int i = 0; i <n ; i++)
        {
            if (!visited[i])
            {
                DFSprint(i);
            }
        }
    }
    void BFSprint(int n) {
        cout << "{ ";
        BFS(n);
        cout << "}" << endl;
    }
    void BFSsearch() {
        BFSprint(0);
        for (int i = 0; i <n; i++)
        {
            if (!visited[i])
            {
                BFSprint(i);
            }
        }
    }
    void visit_reset() {
        memset(visited, 0, n);
    }
    void BFS(int n) {
        queue<int>q;
        q.push(n);
        while (!q.empty())
        {
            int vertex = q.front();
            q.pop();
            cout << vertex << " ";
            visited[vertex] = true;
            sort(edges[vertex].begin(), edges[vertex].end());
            for (int v:edges[vertex])
            {
                if (!visited[v])
                {
                    visited[v] = true;
                    q.push(v);
                }       
            }
        }
    }
};

int main()
{
    int N, M;
    cin >> N >> M;
    Graph graph(N);
    int x, y;
    for (int i = 0; i < M; i++)
    {
        cin >> x >> y;
        graph.insert(x, y);
    }
    graph.DFSsearch();
    graph.visit_reset();
    graph.BFSsearch();
    return 0;
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,767评论 0 33
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,909评论 25 708
  • 对于图的操作,最基本的就是对图的遍历了,图的遍历主要有两种思想,一种是DFS(Deepth First Searc...
    郑明明阅读 389评论 0 2
  • https://pta.patest.cn/pta/test/558/exam/4/question/9497 代...
    qratosone阅读 265评论 0 0
  • 失败是一个相对状态。譬如在大多数人看来,王思聪什么都不做就已经是人生赢家了,但他本人却说在超过他父亲之前都不算成功...
    傻强阅读 331评论 0 0