博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1529 - 并查集
阅读量:4946 次
发布时间:2019-06-11

本文共 910 字,大约阅读时间需要 3 分钟。

题目大意:有\(n\)个储钱罐,每个储钱罐的钥匙都在另一个储钱罐中。求打开每一个储钱罐所需要砸开的最小数量。

\(Solution\):如果储钱罐\(x\)的钥匙在\(y\)中,那么就连边\(x\)->\(y\)。于是每个点的出度都是1。然后就变成了和NOIP 2015 Day1 T2几乎一样的题——Tarjan缩点或者DFS,统计强连通块数量即可。

——但是本题会卡内存,所以这么做会爆栈,MLE妥妥的。所以参考了网上的一种用并查集的“优越做法”。注意到每个点都在且仅在一个强连通分量(也就是若干个无交点的简单环),所以可以把它们直接当成连通分量做,并查集维护之即可。

// BZOJ 1529        #include 
#include
using namespace std; #define N 1000005 int fa[N], n, y; int find(int x) { return fa[x]==x ? x : fa[x]=find(fa[x]); } #define read(x) scanf("%d", &x) #define rep(i,a,b) for (int i=a; i<=b; i++) int main() { read(n); int ans=n; rep(i,1,n) fa[i]=i; rep(x,1,n) { read(y); int fx=find(x), fy=find(y); if (fx!=fy) ans--; fa[fx]=fy; } printf("%d\n", ans); return 0; }

转载于:https://www.cnblogs.com/yearwhk/p/5131739.html

你可能感兴趣的文章
EM算法索引
查看>>
[mysql]匹配是否包含中文,英文
查看>>
CAD实时显示代码过程中对图元的操作
查看>>
[No000048]程序员的成长过程中,有哪些阶段?
查看>>
Codeforces 821E Okabe and El Psy Kongroo(矩阵快速幂)
查看>>
python "=",深,浅 拷贝
查看>>
java.sql.SQLException: Locale not recognized处理
查看>>
BZOJ 2953 POI2002 商务旅行
查看>>
python日期模块
查看>>
笔记54 Mybatis快速入门(五)
查看>>
网站搭建 (第04天) 导航栏与页脚
查看>>
Redis通过Lua一次获取多个key值
查看>>
android EditText不弹出软键盘
查看>>
php将数组写入配置文件
查看>>
ALV 报表
查看>>
Spring+Quartz实现定时任务的配置方法
查看>>
同时启动多个tomcat服务器
查看>>
怎么将iphone上的照片导出到本地文件
查看>>
Repeater+DataPagerSource分页
查看>>
模块化导出
查看>>