查找无向图中连接组件的数量

时间:2016-02-19 17:40:13

标签: 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;

}

1 个答案:

答案 0 :(得分:1)

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

  • v是一个节点
  • graph[v]是连接的载体
  • u是连接向量中的索引
  • 所以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