题目描述

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

输入格式

第一行一个整数 N (1 <= N <= 1.000.000)表示存钱罐的总数.

接下来每行一个整数,第 i+1行的整数代表第i个存钱罐的钥匙放置的存钱罐编号.

输出格式

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


分析题目性质。

题目给了若干个单向关系,我们可以依照这个建出一张有向图。那么显然,只要我们有了一个存钱罐的钥匙,那这个强连通分量里的所有存钱罐都可以打开了。那么我们对图中所有强连通分量进行缩点,入度>0的点就通过其它点得到钥匙,入度为0的点我们就砸开它。所以答案就是入度为0的强连通分量个数。

强连通分量用Tarjan来求,时间复杂度为O(N)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define maxn 1000001
using namespace std; vector<int> to[maxn];
int dfn[maxn],low[maxn],tot;
int col[maxn],ind[maxn],cnt;
int stack[maxn],top;
bool instack[maxn];
int n,ans; inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
} void tarjan(int u){
dfn[u]=low[u]=++tot,stack[++top]=u,instack[u]=true;
for(register int i=0;i<to[u].size();i++){
int v=to[u][i];
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(instack[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int v; cnt++;
do{ v=stack[top--],instack[v]=false; col[v]=cnt; }while(v!=u);
}
} int main(){
n=read();
for(register int i=1;i<=n;i++) to[read()].push_back(i);
for(register int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
for(register int i=1;i<=n;i++){
for(register int j=0;j<to[i].size();j++){
int v=to[i][j];
if(col[i]!=col[v]) ind[col[v]]++;
}
}
for(register int i=1;i<=cnt;i++) if(!ind[i]) ans++;
printf("%d\n",ans);
return 0;
}

[Poi2005]Piggy Banks小猪存钱罐的更多相关文章

  1. [BZOJ1529][POI2005]ska Piggy banks

    [BZOJ1529][POI2005]ska Piggy banks 试题描述 Byteazar 有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar 已经把每个存钱罐的钥匙放 ...

  2. BZOJ 1529: [POI2005]ska Piggy banks( 并查集 )

    每一连通块砸开一个就可以拿到所有的钱, 所以用并查集求连通块数 ------------------------------------------------------------------- ...

  3. 【BZOJ1529】[POI2005]ska Piggy banks Tarjan

    [BZOJ1529][POI2005]ska Piggy banks Description Byteazar 有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar 已经把每个 ...

  4. bzoj1529 [POI2005]ska Piggy banks 并查集

    [POI2005]ska Piggy banks Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1508  Solved: 763[Submit][Sta ...

  5. Taran 缩点【bzoj1529】[POI2005]ska Piggy banks

    [bzoj1529][POI2005]ska Piggy banks Description Byteazar 有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar 已经把每个 ...

  6. BZOJ 1529 [POI2005]ska Piggy banks:并查集

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1529 题意: Byteazar有N个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. By ...

  7. 洛谷 P3420 [POI2005]SKA-Piggy Banks

    P3420 [POI2005]SKA-Piggy Banks 题目描述 Byteazar the Dragon has NN piggy banks. Each piggy bank can eith ...

  8. [Luogu3420][POI2005]SKA-Piggy Banks

    题目描述 Byteazar the Dragon has NNN piggy banks. Each piggy bank can either be opened with its correspo ...

  9. [POI2005] SKA-Piggy Banks

    ps.有关Tarjan算法缩点的简要回顾. 今天上午在Luogu随机到了这道题 Luogu P3420,题目大概是这样: 题目描述 Byteazar the Dragon拥有N个小猪存钱罐.每一个存钱 ...

随机推荐

  1. DirectX12的初始化

    DirectX12的初始化主要分为以下若干步骤: 创建device和gifactory 创建与GPU通信同步相关的objects,command和fence 创建swap chain 为render ...

  2. Django入门实战一

    前言 Django是高水准的Python编程语言驱动的一个开源模型.视图,控制器风格的Web应用程序框架,它起源于开源社区.使用这种架构,程序员可以方便.快捷地创建高品质.易维护.数据库驱动的应用程序 ...

  3. 使用CodeSmith编写ADO.Net三层

    说明 自本文发布日起,发现和完善了编写的CodeSmith几处代码. 故,不再直接在文章添加代码,最新代码参见GitHub https://github.com/catbiscuit/CodeSmit ...

  4. Java学习_注解

    使用注解 注解是放在Java源码的类.方法.字段.参数前的一种特殊"注释". 1 // this is a component: 2 @Resource("hello&q ...

  5. ProxyDroid+wifi设置抓xx点评抓不到的包

    ProxyDroid+wifi设置抓xx点评抓不到的包 一.ProxyDroid介绍 1.下载地址 下载并安装ProxyDroid.(确保您的设备已经ROOT)点击下载 2.界面介绍 (1) Auto ...

  6. git pull 和git fetch的区别

    git pull 是上下文环境敏感的,它会把所有的提交自动给你合并到当前分支当中,没有复查的过程 而git fetch只是把拉去的提交存储到本地仓库中,真正合并到主分支中需要使用merage head ...

  7. C语言I博客作业1

    1 .班级链接: https://edu.cnblogs.com/campus/zswxy/SE2020-3 2 .作业要求链接: https://edu.cnblogs.com/campus/zsw ...

  8. Android——几种数据存储应用浅谈

    (1)android中的数据存储主要有五种方式: 第一种.sharedPreferences存储数据, 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型.基本类型的值.比如应用程序的各种配 ...

  9. java枚举类学习笔记总结

    枚举类的说明: 1.枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类 2.当需要定义一组常量时,强烈建议使用枚举类 3.如果枚举类中只一个对象,则可以作为单例模式的实现方式. 如何自定义枚 ...

  10. UML第三次结对作业

    这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/homework/11274 这个作业的目标 <学会使用专业的建模工具> 队 ...