ユーザーは頂点の数 ( n ) を入力し、次に - 次のn行で - 頂点がどのように接続されているかを入力します。つまり、i番目の行の番号xは、頂点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;
}