题目描述
Byteazar the Dragon 拥有 N 个小猪存钱罐。每一个存钱罐能够用相应的钥匙打开或者被砸开。Byteazar 已经将钥匙放入到一些存钱罐中。现在已知每个钥匙所在的存钱罐,Byteazar 想要买一辆小汽车,而且需要打开所有的存钱罐。然而,他想要破坏尽量少的存钱罐,帮助 Byteazar 去决策最少要破坏多少存钱罐。
读入存钱罐的数量以及相应的钥匙的位置,求出能打开所有存钱罐的情况下,需要破坏的存钱罐的最少数量并将其输出。
输入描述
第一行:包括一个整数 N(1 ≤ N ≤ 10^6),这是 Byteazar the Dragon 拥有的存钱罐的数量。
存钱罐(包括它们对应的钥匙)从 1 到 N 编号。
接下来有 N 行:第 i+1 行包括一个整数 x,表示第 i 个存钱罐对应的钥匙放置在了第 x 个存钱罐中。
输出描述
输出一个整数,表示能打开所有存钱罐的情况下,需要破坏的存钱罐的最少数量。
输入输出样例
示例 1
输入
4
2
1
2
4
输出
2
运行限制
- 最大运行时间:5s
- 最大运行内存: 256M
思路:
参考代码:
def hebin(x,y): #合并
x=find_set(x)
y=find_set(y)
if (x!=y):
s[x]=s[y]
def find_set(x): #查找
if (x!=s[x]):
s[x]=find_set(s[x])
return s[x]
n=int(input())
s=list(range(n+1)) #并查集初始化
ans=0
for i in range(1,n+1):
hebin(i,int(input())) #将每个存钱罐和它里面对应能打开的存钱罐编号进行组合
for i in range(1,n+1):
if s[i]==i:
ans+=1 #此时的存钱罐编号i是并查集树的根节点,ans自增
print(ans)