zoukankan      html  css  js  c++  java
  • [Poi2005]Piggy Banks小猪存钱罐

    Description

    Byteazar有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar已经把每个存钱罐的钥匙放到了某
    些存钱罐里. Byteazar 现在想买一台汽车于是要把所有的钱都取出来. 他想尽量少的打破存钱罐取出所有的钱,问
    最少要打破多少个存钱罐.

    Input

    第一行一个整数 N (1 <= N <= 1.000.000)表示存钱罐的总数. 
    接下来每行一个整数,第 i+1行的整数代表第i个存钱罐的钥匙放置的存钱罐编号.

    Output

    一个整数表示最少打破多少个存钱罐.

    Sample Input

    4
    2
    1
    2
    4
    

    Sample Output

    2
    这道题是可以用并查集来做
    难度不大
    见代码
    #include<bits/stdc++.h>
    using namespace std;
    int ans,a[1000001];
    int find(int x){return a[x]==x?x:a[x]=find(a[x]);}//并查集路径压缩
    int main()
    {
        int n;
        cin>>n;
        for (int i=1;i<=n;i++) 
    a[i]=i; for (int i=1;i<=n;i++) { int x; cin>>x; if (x!=i) a[find(i)]=find(x);//合并两个集合 } for (int i=1;i<=n;i++) if (a[i]==i)
    ans++;//有几个独立的集合 cout<<ans<<endl; return 0; }

    ending。。。。。。

     
    #include<iostream>
    using namespace std;
    int ans,pre[1000001];
    int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);}
    //并查集的“查”+路径压缩
    int main()
    {
        int n;
        cin>>n;
        for (int i=1;i<=n;i++) pre[i]=i;
        for (int i=1;i<=n;i++)
        {
            int x;
            cin>>x;
            if (x!=i)//貌似这句话不写也可以,但还是写着吧
            pre[find(i)]=find(x);//合并两个集合
        }
        for (int i=1;i<=n;i++)
        if (pre[i]==i) ans++;//有几个独立的集合
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    搭建Flask+Vue及配置Vue 基础路由
    vue dev 环境下的跨域访问
    vue 调用常量的config.js文件
    PyCharm 通过Github和Git上管理代码
    MongoDB 配置服务
    2018年11月12日
    搭建 flask 应用
    Python 错误总结
    搭建 Django 平台
    go实现主线程等待子线程都运行完再退出
  • 原文地址:https://www.cnblogs.com/kevin6666/p/10951578.html
Copyright © 2011-2022 走看看