【BZOJ1529】[POI2005]ska Piggy banks

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
In the foregoing example piggy banks 1 and 4 have to be smashed.
题解:Tarjan缩点,答案就是入度为0的连通块的个数
#include <cstdio>
#include <cstring>
int tp,tot,n,ans,cnt,sum;
int head[1000010],next[1000010];
int deep[1000010],low[1000010],sta[1000010],ins[1000010],vis[1000010],bel[1000010],d[1000010];
int min(int x,int y)
{
return x<y?x:y;
}
void tarjan(int x)
{
int i,t;
deep[x]=low[x]=++tot;
ins[x]=vis[x]=1;
sta[++tp]=x;
for(i=head[x];i;i=next[i])
{
if(!vis[i])
{
tarjan(i);
low[x]=min(low[x],low[i]);
}
else if(ins[i])
low[x]=min(low[x],deep[i]);
}
if(deep[x]==low[x])
{
ans++;
do
{
t=sta[tp--];
bel[t]=ans;
ins[t]=0;
}while(t!=x);
}
}
int main()
{
scanf("%d",&n);
int i,j,a;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
next[i]=head[a];
head[a]=i;
}
for(i=1;i<=n;i++)
if(!vis[i])
tarjan(i);
for(i=1;i<=n;i++)
for(j=head[i];j;j=next[j])
if(bel[i]!=bel[j])
d[bel[j]]=1;
for(i=1;i<=ans;i++) if(!d[i]) sum++;
printf("%d",sum);
return 0;
}

【BZOJ1529】[POI2005]ska Piggy banks Tarjan的更多相关文章

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

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

  2. [BZOJ1529][POI2005]ska Piggy banks

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

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

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

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

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

  5. 【BZOJ】1529 [POI2005]ska Piggy banks

    [算法](强连通分量)并查集 [题解] 1.用tarjan计算强连通分量并缩点,在新图中找入度为0的点的个数就是答案. 但是,会爆内存(题目内存限制64MB). 2.用并查集,最后从1到n统计fa[i ...

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1529 [题目大意] 给出一张n个点n条边的有向图,问选取几个点为起点可以遍历全图 [题 ...

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

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

  8. 【BZOJ1528】[POI2005]sam-Toy Cars 贪心

    [BZOJ1528][POI2005]sam-Toy Cars Description Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio ...

  9. 【border相关】【P3426】 [POI2005]SZA-Template

    [border相关][P3426] [POI2005]SZA-Template Description 给定一个字符串 \(S\),要求一个最短的字符串 \(T\),使得 \(S\) 可以由 \(T\ ...

随机推荐

  1. Arrays.sort和Collections.sort实现原理解析

    Arrays.sort和Collections.sort实现原理解析 1.使用 排序 2.原理 事实上Collections.sort方法底层就是调用的array.sort方法,而且不论是Collec ...

  2. etl获取转换文件名

  3. Specified VM install not found: type Standard VM, name jdk1.7

    网上抄袭来抄袭去,都说是将“workspace /.metadata/.plugins/org.eclipse.debug.core/.launches/”下的文件都删除掉. 的确,删除了解决问题了, ...

  4. Windows通用知识讲解一

    Window应用程序的类型 --控制台程序Console DOS程序,本身没有窗口,通过Windows DOS窗口执行 --窗口程序 拥有自己的窗口,可以与用户交互 --库程序 存放代码.数据的程序, ...

  5. 关于Cocos2d-x运行项目时弹框崩溃的解决

    想要运行工程的时候,跳出一个框说停止cantnot open the window,还提到什么GLVM之类的,这是显卡驱动出现问题,如果是远程连接电脑的话,很有可能就是用来远程连接的那台电脑的显卡驱动 ...

  6. VS2013环境生成和调用DLL动态链接库

    http://blog.csdn.net/u010273652/article/details/25514577 创建动态库方法: 创建动态库是生成 .dll .lib 两个个文件 文件 -> ...

  7. Global.asax中使用HttpContext为空

    application启动的时候并没有对应的HttpContext.Current请求所以会出错 用System.Web.Hosting.HostingEnvironment.MapPath就可以了

  8. \avformat.h(40) : fatal error C1083: 无法打开包括文件:“libavcodec/avcodec.h”: No such file or directory

    在ffmpeg库下面的头文件包含时用"../"表示当前项目下的头文件就ok了

  9. tomcat日志神器--kibana

    最近公司搭了套kibana的日志系统,感受比原来查看日志方便多了.记得以前查看日志是通过ssh到服务器,查看系统日志用vi查看器查看或者下载到本地,用logview查看搜索,可读性很低.自从用了kib ...

  10. 【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。

    题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次 思路如下: 子线程语主线程为互斥,可用SYNCHRONIZED.很容易想 ...