Description

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

Input

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

Output

一个整数表示最少打破多少个存钱罐.
 
正解是并查集,专门卡 $tarjan$ 的空间
#include<bits/stdc++.h>
#define maxn 1000002
using namespace std;
void setIO(string s)
{
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
stack<int>S;
int scc,cnt,edges;
int low[maxn],pre[maxn],vis[maxn],bin[maxn],du[maxn];
vector<int>G[maxn];
void tarjan(int u)
{
S.push(u);
low[u]=pre[u]=++scc;
vis[u]=1;
for(int i=0,sz=G[u].size();i<sz;++i)
{
int v=G[u][i];
if(!vis[v]) tarjan(v), low[u]=min(low[u],low[v]);
else if(vis[v]==1) low[u]=min(low[u], pre[v]);
}
if(low[u]==pre[u])
{
++cnt;
for(;;)
{
int x=S.top(); S.pop();
bin[x]=cnt, vis[x]=-1;
if(x==u) break;
}
}
}
int main()
{
// setIO("input");
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
int a;
scanf("%d",&a);
G[a].push_back(i);
}
for(int i=1;i<=n;++i)
if(!vis[i])
tarjan(i);
for(int i=1;i<=n;++i)
{
for(int j=0,sz=G[i].size();j<sz;++j)
{
if(bin[i]!=bin[G[i][j]]) ++du[bin[G[i][j]]];
}
}
int ans=0;
for(int i=1;i<=cnt;++i) if(!du[i]) ++ans;
printf("%d\n",ans);
return 0;
}

  

最新文章

  1. Angular2 入门
  2. 关于无法使用xx-pc附加到应用程序iisexpress.exe
  3. Oracle常见授权与回收权限(grant和revoke)学习记录
  4. 学习Scala02 基本类型
  5. 【CodeVS 1004】四子连棋
  6. WebContentGenerator
  7. 用 Qt 中的 QDomDocument类 处理 XML 文件(下)
  8. ubuntu14.04下手动安装eclipse
  9. Linq学习系列-----1.2 一个简单方法的改进思考及不同的执行形式
  10. 使用mpvue开发小程序教程(五)
  11. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流
  12. spingboot一键部署到阿里云(Cloud Toolkit工具)
  13. DWM1000 巧用Status 快速Debug
  14. Git 撤销到某个版本的代码
  15. easyui 传递参数报错(错误:uncaught SyntaxError: Unexpected identifier)
  16. LeetCode 258 Add Digits 解题报告
  17. You Don&#39;t Know JS: Scope &amp; Closures (第3章: 函数 vs 块作用域)
  18. HTTP、TCP、IP协议常见面试题
  19. [sed] linux sed 批量替换字符串
  20. c#基础学习(0626)之占位符、转义符

热门文章

  1. hdu_1061_Rightmost Digit_201311071851
  2. 洛谷——P2347 砝码称重
  3. ERROR: mount point &lt;/.alt.rootd3_EISMar14/opt/oracle/product/10.2&gt; is already in use
  4. Oracle批量恢复drop操作删除的表、索引等对象
  5. jsp上传下载+SmartUpload插件上传
  6. Struts2—Action
  7. Web Service学习-CXF开发Web Service的权限控制(二)
  8. luogu2746 校园网
  9. oc26--Property,省略setget的声明
  10. elasticsearch date_histogram