【问题标题】:C++ Depth First Search (DFS) Implementation [closed]C ++深度优先搜索(DFS)实现[关闭]
【发布时间】:2014-09-04 17:29:42
【问题描述】:

我正在尝试实现 Competitive Programming 1 book 中描述的以下 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

如下图:

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

感谢任何帮助。

【问题讨论】:

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


    【解决方案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

    【讨论】:

      【解决方案2】:

      整体逻辑看起来还可以,但我在细节中看到了一些奇怪的东西:

      1. 在第 17 行,for 循环应该是 adj[u],而不是 adj[i] ??

      我注意到的其他事情:

      1. 不使用单字母变量名将极大地帮助我们理解您的代码...意味着您会收到更多回复。
      2. 您连接的组件将以相反的顺序打印(3 2 1,而不是 1 2 3),因为在 dfs() 中,您在递归调用之后打印
      3. 我质疑为什么当第二个 int 为 1 时您在第 31 行和第 32 行使用一对,而您从不使用它。

      【讨论】:

      • 1.那是主要问题。按照 Piotr S. 1 的建议解决。对此感到抱歉。 2. 也解决了,谢谢。 3. 数字 1 应该是权重,但我还没有使用它们
      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 2014-06-02
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多