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

C++ C++;深度优先搜索(DFS)实现,c++,vector,graph,depth-first-search,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

我试图实现《竞争编程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);
}
对于下图:

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

非常感谢您的帮助。

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

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

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

  • 在第17行中,for循环应该是adj[u],而不是adj[i]
  • 我注意到的其他事情:

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

  • 1.这是主要问题。按照Piotr S.的建议解决了。1.对此表示抱歉。2.也解决了这个问题,谢谢。3.数字1应该是重量,但我只是还没有使用它们
    for (int i = 0; i < (int)adj[i].size(); i++) {
    
    for (int i = 0; i < (int)adj[u].size(); i++) {
    //                           ^ u, not i