Description
Byteazar 有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar 已经把每个存钱罐的钥匙放到了某些存钱罐里. Byteazar 现在想买一台汽车于是要把所有的钱都取出来. 他想尽量少的打破存钱罐取出所有的钱,问最少要打破多少个存钱罐.
Input
第一行一个整数 N (1 <= N <= 1.000.000) – 表示存钱罐的总数. 接下来每行一个整数,第 i+1行的整数代表第i个存钱罐的钥匙放置的存钱罐编号.
Output
一个整数表示最少打破多少个存钱罐.
Sample Input
4
2
1
2
4
Sample Output
2
In the foregoing example piggy banks 1 and 4 have to be smashed.
HINT
Source
很明显一个环只要拆一个点出来就行了
所以并查集维护一下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 1000010
#define GET (ch>='0'&&ch<='9')
using namespace std;
int n,ans;
int f[MAXN];
void in(int &x)
{
char ch=getchar();x=0;
while (!GET) ch=getchar();
while (GET) x=x*10+ch-'0',ch=getchar();
}
int find(int x) { return f[x]==x?x:f[x]=find(f[x]); }
int main()
{
in(n);int q;
for (int i=1;i<=n;i++) f[i]=i;
for (int i=1;i<=n;i++)
{
in(q);
int x=find(i),y=find(q);
if (x!=y) f[x]=y;
}
for (int i=1;i<=n;i++) ans+=(find(i)==i);
printf("%d\n",ans);
}