zoukankan      html  css  js  c++  java
  • luogu P3420 [POI2005]SKA-Piggy Banks

    题目描述

    Byteazar the Dragon has NN piggy banks. Each piggy bank can either be opened with its corresponding key or smashed. Byteazar has put the keys in some of the piggy banks - he remembers which key has been placed in which piggy bank. Byteazar intends to buy a car and needs to gain access to all of the piggy banks. However, he wants to destroy as few of them as possible. Help Byteazar to determine how many piggy banks have to be smashed.

    TaskWrite a programme which:

    reads from the standard input the number of piggy banks and the deployment of their corresponding keys,finds the minimal number of piggy banks to be smashed in order to gain access to all of them,writes the outcome to the standard output.

    有n个储钱罐,每个的钥匙都在另一个里面,求取出所有储钱罐中的钱最少要砸开几个

    输入输出格式

    输入格式:

    The first line of the standard input contains a single integer NN (1le Nle 1 000 0001N1 000 000) - this is the number of piggy banks owned by the dragon. The piggy banks (as well as their corresponding keys) are numbered from 11 to NN. Next, there are NNlines: the (i+1)(i+1)'st line contains a single integer - the number of the piggy bank in which the ii'th key has been placed.

    输出格式:

    The first and only line of the standard output should contain a single integer - the minimal number of piggy banks to be smashed in order to gain access to all of the piggy banks.

    输入输出样例

    输入样例#1:
    4
    2
    1
    2
    4
    输出样例#1:
    2

    并查集,由于每个盒子的入度只能是1,既然能并到一起,那么一定有一个起始节点;
    最后统计集合个数
    #include<cstdio>
    int n;
    const int maxn = 1000006;    
    int a[maxn];
    int father[maxn];
    int find(int x) {
        if(father[x]!=x)father[x]=find(father[x]);
        return father[x];
    }
    void unionn(int x,int y) {
        int fx=find(x),fy=find(y);
        if(fx!=fy)father[fx]=fy;
    }
    int main () {
        scanf("%d",&n);
        for(int i=1;i<=n;++i)father[i]=i;
        for(int i=1;i<=n;++i) {
            scanf("%d",a+i);unionn(i,a[i]);    
        }
        int ans=0;
        for(int i=1;i<=n;++i) 
            if(father[i]==i)ans++;
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    使用Delphi自带的TDockTabSet组件实现停靠功能(Jeremy North)
    揭秘换肤技术(转载)
    cdecl、stdcall、fastcall函数调用约定区别(转)
    Delphi XE的RTTI增强,动态Hook某些内部事件
    sizeof和strlen解析
    由swap引出的局部变量,形参和指针的小问题
    单链表的逆置算法
    关于C++中的虚拟继承的一些总结
    关于"引用"的几点说明
    求最长公共子序列(子序列在原串中可以不连续)
  • 原文地址:https://www.cnblogs.com/sssy/p/7674296.html
Copyright © 2011-2022 走看看