zoukankan      html  css  js  c++  java
  • (并查集) poi 2005年

    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<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    #define maxn 1000010
    int n,set[maxn],xx,ans;
    int find(int x)
    {
          if(x!=set[x])
                set[x]=find(set[x]);
          return set[x];
    }
    int main()
    {
          scanf("%d",&n);
          for(int i=1;i<=n;i++)
                set[i]=i;
          for(int i=1;i<=n;i++)
          {
              scanf("%d",&xx);
              int f1,f2;
              f1=find(i),f2=find(xx);
              if(f1!=f2)
                      set[f2]=f1;
          }
          for(int i=1;i<=n;i++)
                if(set[i]==i)
                      ans++;
          printf("%d
    ",ans);
          return 0;
    }
    

      

  • 相关阅读:
    结对开发:电梯调度(2)
    小组站立会议
    小组站立会议
    小组站立会议
    小组站立会议4月15日
    小组站立会议
    小组站立会议
    团队个人每天详细计划汇总
    Spring冲刺计划会议
    团队项目开发
  • 原文地址:https://www.cnblogs.com/a972290869/p/4227763.html
Copyright © 2011-2022 走看看