[POI2005] SKA-Piggy Banks

有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;
}

原文地址:https://www.cnblogs.com/mollnn/p/12335903.html