农夫约翰有 头奶牛,编号
。
通过使用易拉罐和绳子构成的土制电话,它们会在约翰不注意的时候相互通信。
每头奶牛最多可以将消息转发给另一头奶牛:
对于奶牛 ,它会将自己收到的任何信息转发给奶牛
(
与
一定不同)。
如果 为
,则奶牛
不转发消息。
不幸的是,奶牛们意识到来自某些奶牛的消息可能最终陷入循环之中,不断地被转发。
请确定所有奶牛中有多少只奶牛发出的消息不会永远陷入循环之中。
输入格式
第一行包含整数 。
接下来 行,每行包含一个整数
。
输出格式
输出发出的消息不会陷入循环的奶牛的数量。
数据范围
输入样例:
5
0
4
1
5
4
输出样例:
2
样例解释
奶牛 不发送任何信息,因此不会陷入循环。
奶牛 发送信息给奶牛
,因此也不会陷入循环。
其他三头奶牛发送的信息都会陷入循环。
可以发现不会进入循环的牛一定与 0 是同一个集合
using namespace std;
const int N = 1010;
int n;
int p[N];
int find(int x){
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
int main(){
cin >> n;
for(int i = 1; i < N; i++) p[i] = i;
for(int i = 1; i <= n; i++){
int x;
cin >> x;
int px = find(x), py = find(i);
if(py < px) swap(py, px);
if(px != py) p[py] = px;
}
int res = 0;
for(int i = 1; i <= n; i++)
if(!find(i)) res++;
cout << res << endl;
return 0;
}