有N个小猪存钱罐。每一个存钱罐能够用相应的钥匙打开或者被砸开。Byteazar已经将钥匙放入到一些存钱罐中。现在已知每个钥匙所在的存钱罐,Byteazar想要买一辆小汽车,而且需要打开所有的存钱罐。然而,他想要破坏尽量少的存钱罐,帮助Byteazar去决策最少要破坏多少存钱罐。
Solution
无脑缩点然后数出入度为 (0) 的点的个数?
这样做好像有点暴力。
考虑到每个连通块有且仅有一个环
所以需要打破箱子的数量就是连通块的数量
那就转成无向图搜吧(我才不写 DSU)
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
vector <int> g[N];
int n,t,ans,vis[N];
void dfs(int p) {
vis[p]=1;
for(int q:g[p]) if(vis[q]==0) {
dfs(q);
}
}
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) {
cin>>t;
g[t].push_back(i);
g[i].push_back(t);
}
for(int i=1;i<=n;i++) {
if(vis[i]==0) {
dfs(i);
++ans;
}
}
cout<<ans;
}