图的深搜和宽搜C++

第一行输入两个整数 n 和 m,表示顶点数和边数。接下来 m 行,每行输入两个整数 x 和 y,表示一条从 x 连向 y 的无向边。之后输入一个整数 k,表示深度优先搜索的起点。注意顶点是从 0 开始编号的哦。输入完成后会将遍历结果输出。

假如输入

5 6
0 1
1 2
1 3
2 3
0 4
1 4
0

遍历的结果为

0
1
2
3
4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

class Graph {
private:
    int n;  //!< 顶点数量
    vector<int> *edges;  //!< 邻接表
    bool *visited;

public:
    Graph(int input_n) {
        n = input_n;
        edges = new vector<int>[n];
        visited=new bool[n];
        memset(visited,0,n);
    }

    ~Graph() {
        delete[] edges;
        delete[] visited;
    }

    void insert(int x, int y) {
        edges[x].push_back(y);
        edges[y].push_back(x);
    }

    void dfs(int vertex) {
        cout<<vertex<<endl;
        visited[vertex]=true;
        for(int adj_vertex:edges[vertex]){
            if(!visited[adj_vertex]){
                dfs(adj_vertex);
            }
        }
    }
};

int main() {
    int n, m, k;
    cin >> n >> m;
    Graph g(n);
    for (int i = 0; i < m; ++i) {
        int x, y;
        cin >> x >> y;
        g.insert(x, y);
    }
    cin >> k;
    g.dfs(k);
    return 0;
}

第一行输入两个整数 n 和 m,表示顶点数和边数。接下来 m 行,每行输入两个整数 x 和 y,表示一条从 x 连向 y 的无向边。之后输入一个整数 k,表示广度优先搜索的起点。注意顶点是从 0 开始编号的哦。输入完成后会将遍历结果输出。

假如输入

5 6
0 1
1 2
1 3
2 3
0 4
1 4
0

遍历的结果为

0
1
4
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

class Graph {
private:
    int n;
    bool *visited;
    vector<int> *edges;    

public:
    Graph(int input_n) {
        n = input_n;
        edges = new vector<int>[n];
        visited = new bool[n];
        memset(visited, 0, n);
    }

    ~Graph() {
        delete[] edges;
        delete[] visited;
    }

    void insert(int x, int y) {
        edges[x].push_back(y);
        edges[y].push_back(x);
    }

    void bfs(int start_vertex) {
        queue<int> bfs_queue;
        bfs_queue.push(start_vertex);
        visited[start_vertex]=true;
        while(!bfs_queue.empty()){
            int vertex=bfs_queue.front();
            cout<<vertex<<endl;
            bfs_queue.pop();
            for(int adj_vertex:edges[vertex]){
                if(!visited[adj_vertex]){
                    visited[adj_vertex]=true;
                    bfs_queue.push(adj_vertex);
                }
            }
        }

    }
};

int main() {
    int n, m, k;
    cin >> n >> m;
    Graph g(n);
    for (int i = 0; i < m; ++i) {
        int x, y;
        cin >> x >> y;
        g.insert(x, y);
    }
    cin >> k;
    g.bfs(k);
    return 0;
}

打个小广告

欢迎加入我的知识星球「基你太美」,我会在星球中分享 AucFrame 框架、大厂面经、AndroidUtilCode 更详尽的说明…一切我所了解的知识,你可以通过支付进入我的星球「基你太美」进行体验,加入后优先观看星球中精华的部分,如果觉得星球的内容对自身没有收益,你可以自行申请退款退出星球,也没必要加我好友;如果你已确定要留在我的星球,可以通过扫描如下二维码(备注:基你太美+你的星球昵称)加我个人微信,方便我后续拉你进群(PS:进得越早价格越便宜)。

我的二维码