• [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;
    }
    
    
  • 相关阅读:
    常见设备标记长度查询
    word怎么在方框中打对号
    shell dict 操作
    词表数据转换
    GoLand tool tips
    mac使用技巧
    人生三大陷阱
    【js重学系列】执行上下文
    uniapp-ui库
    【js重学系列】instanceof
  • 原文地址:https://www.cnblogs.com/mollnn/p/12335903.html
Copyright © 2020-2023  润新知