Пользователи вводят количество вершин (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;
}