C++ 深度优先搜索 (DFS) 实现

标签 c++ vector graph depth-first-search

我正在尝试实现竞争性编程 1 书中描述的以下 DFS 代码:

#include <cstdio>
#include <vector>
using namespace std;

#define MAX 10
#define DFS_BLACK 1
#define DFS_WHITE -1
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<int> vi;

vi dfs_num;
vector<vii> adj(MAX);

void dfs(int u) {
    dfs_num[u] = DFS_BLACK;
    for (int i = 0; i < (int)adj[i].size(); i++) {
        ii v = adj[u][i];
        if (dfs_num[v.first] == DFS_WHITE)
            dfs(v.first);
    }
    printf(" %d", u);
}

int main() {
    int v, e, x, y;

    scanf("%d %d", &v, &e);
    for (int i = 0; i < e; i++) {
        scanf("%d %d", &x, &y);
        adj[x].push_back(ii(y, 1));
        adj[y].push_back(ii(x, 1));
    }

    int numCC = 0;
    dfs_num.assign(v, DFS_WHITE);
    for (int i = 0; i < v; i++)
        if (dfs_num[i] == DFS_WHITE)
            printf("Component %d:", ++numCC), dfs(i), printf("\n");
    printf("There are %d connected components\n", numCC);
}

我想要得到的是:

Input:        Output:
9 7           Component 1: 0 1 2 3 4
0 1           Component 2: 5
1 2           Component 3: 6 7 8
1 3           There are 3 connected components
2 3
3 4
6 7
6 8

对于下图:

graph1

但是我收到“Component 1: 3 2 1”然后它崩溃了。我做错了什么?

感谢任何帮助。

最佳答案

for (int i = 0; i < (int)adj[i].size(); i++) {

进入:

for (int i = 0; i < (int)adj[u].size(); i++) {
//                           ^ u, not i

Live demo link

关于C++ 深度优先搜索 (DFS) 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25671618/

相关文章:

c++ - 如何解决堆栈 "smashing detected"

c++ - 第一次使用Qt : How to display an image?

c++ - 通过柯南安装仅 header 包时出错

c++ - 将 int 添加到 vector 中

c++ - 我不明白为什么 for-loop 不适用于此代码

C图。无法将边添加到邻接表中

r - 用 R 中的因子绘制线图

c++ - 如何在 C++ 中将 10 位映射到 6 位(尽可能高效)?

c++ - 在记录集中搜索/更新值

c++ - 从节点和关系生成 block 的算法