c++ - 在无向图中查找连接组件的数量

标签 c++ graph depth-first-search connected-components

用户输入顶点数 (n),然后 - 在接下来的 n 行中 - 顶点是如何连接的,即数 x i 行中的 表示顶点 i 与顶点 x 相连(该图是无向的)。任务是找到这个图中连接的组件的数量,而我的代码 - 由于某种原因我无法找到 - 输出错误的值(例如,输入 4 2 1 2 4 ,我的代码输出 4 而不是 2)。非常感谢任何帮助。

#include <iostream>
#include <vector>
#include <stack>

int n;

using namespace std;
vector <int> graph[1000006];
int components[1000006];
int no_of_components;
stack <int> mystack;

int main(){

    cin >> n;

    for (int i=0; i<n; i++){
        int X;
        cin >> X;
        graph[X-1].push_back(i);
    }

    for (int i=0; i<n; i++){

        if (components[i]>0) continue;

        no_of_components++;

        mystack.push(i);
        components[i]=no_of_components;

        while (mystack.empty()==false){
            int v;

            v=mystack.top();
            mystack.pop();

            for (int u=0; u<graph[v].size(); u++){
                if (components[u]>0) continue;

                mystack.push(u);
                components[u]=no_of_components;

            }
        }
    }

    cout << no_of_components;

    return 0;

}

最佳答案

在您的代码中,允许您遍历节点 v 的连接的计数器 u 与连接本身之间存在混淆:

  • v是一个节点
  • graph[v] 是连接 vector
  • u 是连接 vector 中的索引
  • 所以 graph[v][u] 是连接到 vcomponent[graph[v][u]] 的节点您必须更新的组件标记

因此您必须按如下方式更正内部 for 循环:

        for (int u=0; u<graph[v].size(); u++){
            if (components[graph[v][u]]>0) continue;

            mystack.push(graph[v][u]);
            components[graph[v][u]]=no_of_components;

        }

然后按预期工作。

Online demo

关于c++ - 在无向图中查找连接组件的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35511463/

相关文章:

python - 马与主教的最少步数

c++ - 是否可以描述一些原始类型的子类型?

c++ - C++中函数内的静态变量 - 即使函数不运行也分配?

带有加权无向图的 Python DFS 最短路径搜索

algorithm - 寻找任意两个节点之间多加权边的最短路径

java - 在 GRAL 中绘制多个图形

java - 使用 DFS 检测无向图中的循环

c++ - 参数包没有用 ‘...' 扩展——gcc 的另一个可变参数模板错误?

c++ - 嵌套 Ifs VS 2 个独立的 IFs - 性能方面?

ios - 核心图标题搜索路径,递归是什么意思?