Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <cstdio>
- #include <vector>
- using namespace std;
- const char opened = 2;
- const char marked = 1;
- const char untouched = 0;
- int n, tmp, *prev, count;
- char *vis;
- vector<int> *a;
- void ds(int k);
- int main(){
- cin >> n;
- a = new vector<int>[n];
- prev = new int[n];
- vis = new char[n];
- count = 0;
- for (int i = 0; i < n; i++){
- cin >> tmp;
- a[--tmp].push_back(i);
- prev[i] = tmp;
- vis[i] = untouched;
- }
- for (int i = 0; i < n; i++){
- if (vis[i] == opened)
- continue;
- int j = i;
- while (vis[prev[j]] == untouched){
- vis[j] = marked;
- j = prev[j];
- }
- ds(j);
- count++;
- }
- cout << count << endl;
- delete [] a;
- delete [] vis;
- delete [] prev;
- return 0;
- }
- void ds(int k){
- vis[k] = opened;
- for (int i = 0; i < a[k].size(); i++){
- if (vis[a[k][i]] == opened)
- continue;
- ds(a[k][i]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement