题目链接:P3420 [POI2005] SKA-Piggy Banks
题目描述
Byteazar the Dragon 拥有 N N N 个小猪存钱罐。每一个存钱罐能够用相应的钥匙打开或者被砸开。Byteazar 已经将钥匙放入到一些存钱罐中。现在已知每个钥匙所在的存钱罐,Byteazar 想要买一辆小汽车,而且需要打开所有的存钱罐。然而,他想要破坏尽量少的存钱罐,帮助 Byteazar 去决策最少要破坏多少存钱罐。
输入格式
第一行包括一个整数 N N N ( 1 ≤ N ≤ 1000000 1\le N\le 1000000 1≤N≤1000000),表示 Byteazar the Dragon 拥有的存钱罐的数量。
存钱罐(包括它们对应的钥匙)从 1 1 1 到 N N N 编号。
接下来有 N N N 行:第 i + 1 i+1 i+1 行包括一个整数 x x x,表示第 i i i 个存钱罐对应的钥匙放置在了第 x x x 个存钱罐中。
输出格式
仅一行:包括一个整数,表示能打开所有存钱罐的情况下,需要破坏的存钱罐的最少数量。
样例 #1
样例输入 #1
4
2
1
2
4
样例输出 #1
2
import java.util.Scanner;
public class Main {
public static int[] fa;
//查询
public static int find(int x) {
if (fa[x] == x) {
return x;
} else {
fa[x] = find(fa[x]);
return fa[x];
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
fa = new int[n + 1];
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
for (int i = 1; i <= n; i++) {
int value = scanner.nextInt();
if (value != i) {
fa[find(value)] = find(i);
}
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (find(fa[i]) == i) {
++cnt;
}
}
System.out.println(cnt);
}
}