本来以为是tarjan缩点……但是64MB的空间根本不足以存下原图和缩点后的新图。所以呢……并查集= =

  orz hzwer

MLE的tarjan:

 /**************************************************************
Problem: 1529
User: Tunix
Language: C++
Result: Memory_Limit_Exceed
****************************************************************/ //BZOJ 1529
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
const int N=; void read(int &v){
v=;int sign=; char ch=getchar();
while(ch<'' || ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){v=v*+ch-''; ch=getchar();}
v*=sign;
}
/********************tamplate*******************/
int dfn[N],low[N],dfs_clock,SCC=,belong[N],n;
int head[N],to[N],next[N],cnt;
void ins(int x,int y){
to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
}
int t[N],ne[N],h[N];
void add(int x,int y){
t[++cnt]=y; ne[cnt]=h[x]; h[x]=cnt;
}
bool inst[N];
int st[N],top=;
void tarjan(int x){
int y;
dfn[x]=low[x]=++dfs_clock;
st[top++]=x;
inst[x]=;
for(int i=head[x];i;i=next[i]){
y=to[i];
if (!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if (inst[y]) low[x]=min(low[x],dfn[y]);
}
if (dfn[x]==low[x]){
++SCC;
for(y=;y!=x;){
y=st[--top];
inst[y]=;
belong[y]=SCC;
}
}
}
int in[N];
void rebuild(){
F(x,,n)
for(int i=head[x];i;i=next[i])
if (belong[x]!=belong[to[i]]){
add(belong[x],belong[to[i]]);
in[belong[to[i]]]++;
}
}
/***********************************************/ int main(){
#ifndef ONLINE_JUDGE
freopen("1529.in","r",stdin);
#endif
read(n);
int x;
F(i,,n){
read(x);
ins(x,i);
}
F(i,,n) if (!dfn[i]) tarjan(i);
rebuild();
int ans=;
F(i,,SCC) if(in[i]==) ans++;
printf("%d\n",ans);
return ;
}

并查集:

 /**************************************************************
Problem: 1529
User: Tunix
Language: C++
Result: Accepted
Time:908 ms
Memory:4712 kb
****************************************************************/ //BZOJ 1529
#include<cstdio>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
const int N=; void read(int &v){
v=;int sign=; char ch=getchar();
while(ch<'' || ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){v=v*+ch-''; ch=getchar();}
v*=sign;
}
int fa[N],n;
int getfather(int x){
if (fa[x]!=x) fa[x]=getfather(fa[x]);
return fa[x];
}
int main(){
read(n);
int x;
F(i,,n) fa[i]=i;
F(i,,n){
read(x);
int f1=getfather(i),f2=getfather(x);
if (f1!=f2) fa[f1]=f2;
}
int ans=;
F(i,,n) if (fa[i]==i) ans++;
printf("%d\n",ans);
return ;
}

【BZOJ】【1529】 【POI2005】ska Piggy banks的更多相关文章

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

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

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

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

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

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

  4. [BZOJ1529][POI2005]ska Piggy banks

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

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

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

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

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

  7. 【BZOJ 2754 喵星球上的点名】

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2512  Solved: 1092[Submit][Status][Discuss] Descript ...

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

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

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

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

随机推荐

  1. xenserver xensource.log不断增长

    转载:http://blog.sina.com.cn/s/blog_4ca83f830100xded.html     相信很多人被Xenserver日志填满磁盘空间,导致机器最终挂掉的问题所困扰,我 ...

  2. java面试题小全

    面向对象的特征有哪些方面   1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题,而6. 只是选择其中的 ...

  3. [javascript|基本概念|Underfined]学习笔记

    Underfined类型的值:underfined(只有一个) 1/声明未初始化 e.g.:var msg;-->msg == underfined:true 2/申明并值初始化为underfi ...

  4. ThinkPHP中的内置标签

    ThinkPHP中的内置标签 1.内置标签分类 闭合标签 <tag></tag> 开放标签 <tag /> 2.包含文件标签 主要功能:实现对文件的包含(类似于re ...

  5. SpringMvc入门二----HelloWorld

    1. 导入需要的架包: 2. 配置web.xml,添加Servlet <servlet> <servlet-name>springmvc</servlet-name> ...

  6. 十个最常见的Java字符串问题

    翻译自:Top 10 questions of Java Strings 1.怎样比较字符串?用”==”还是用equals()? 简单地说,”==”测试两个字符串的引用是否相同,equals()测试两 ...

  7. Boost库实现线程池学习及线程实现的异步调用

    A.Boost线程池实现 参考自: Boost库实现线程池实例 原理:使用boost的thread_group存储多个线程,使用bind方法将要处理的函数转换成线程可调用的函数进行执行:使用队列存储待 ...

  8. 杀死进程 kill -9

    cui@bug:~$ killall -h 用法: killall [选项]... [--] 进程名... killall -l, --list killall -V, --version -e,-- ...

  9. js中substring和substr的用法比较

    推荐使用substring 方法   stringObject.substring(start,stop)   stringObject.substr(start,length)   定义和用法 提取 ...

  10. 对图片进行各种样式裁对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等剪:圆形、星形、心形、花瓣形等--第三方开源--CustomShapeImageView

    CustomShapeImageView在github上的项目主页是:https://github.com/MostafaGazar/CustomShapeImageView 如果仅仅是需要获取圆形. ...