题目描述

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;
}

最新文章

  1. iOS-APP提交上架流程(新手必看!2016年3月1日最新版)
  2. scrapy 的 selector 练习
  3. iOS 学习资料整理
  4. 【Unity3D基础教程】给初学者看的Unity教程(七):在Unity中构建健壮的单例模式(Singleton)
  5. pick定理:面积=内部整数点数+边上整数点数/2-1
  6. 安装Oracle时选择桌面类和服务器类的区别
  7. Hdu 3177 Crixalis&#39;s Equipment
  8. Stat
  9. 《sql---教学反馈系统-阶段项目2》
  10. 蓝桥杯-打印大X-java
  11. apply/call/bind的区别与用法
  12. 锐动视频SDK在金融业务加密双录管理系统通用解决方案
  13. VM11 CentOS6.7 i386 安装 oracle 11g r2
  14. ADO.NET读取配置文件
  15. React Native &amp; Google &amp; Proxy
  16. Ubuntu 12.04安装教程详细步骤(图解)
  17. Centos7提示swap交换空间不足解决方法
  18. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!
  19. jmeter响应信息unicode 编码转成中文
  20. 170526、spring 执行定时任务

热门文章

  1. js下 Day13、面向对象
  2. [日常摸鱼]bzoj1038 [ZJOI2008]瞭望塔-模拟退火/几何
  3. C4 模型 - 可视化架构设计
  4. C# 多态virtual标记重写 以及EF6 查询性能AsNoTracking
  5. 浅析Python装饰器
  6. 解决[BScroll warn]: Can not resolve the wrapper DOM. Vue better-scroll
  7. java动态代理实现与原理详细分析(转)
  8. springmvc 统一处理异常
  9. Docker之1---介绍和安装
  10. APP逆向案例---x会app