
食物链(并查集)
发布日期:2021-05-14 16:43:46
浏览次数:17
分类:精选文章
本文共 1631 字,大约阅读时间需要 5 分钟。
AC代码解析与实现
1. finder函数
int find(int x) { if (x != p[x]) { int t = find(p[x]); d[x] += d[p[x]]; p[x] = t; } return p[x];}
这个函数主要是路径压缩的实现,通过递归找到集合中的根,同时把当前节点的数据值与路径上的节点的数据值相加,并将路径上的节点直接指向根节点,实际上完成了路径压缩操作。
2. main函数
#include#include #include using namespace std;const int N = 100010;int d[N], p[N];int find(int x) { if (x != p[x]) { int t = find(p[x]); d[x] += d[p[x]]; p[x] = t; } return p[x];}int main() { int res = 0; int m, n; cin >> n >> m; for (int i = 1; i <= n; i++) p[i] = i; while (m--) { int a, b, c; cin >> a >> b >> c; int px = find(b), py = find(c); if (b > n || c > n) { res++; } else if (a == 1) { if (px == py && (d[c] - d[b]) % 3 == 0) { res++; } else if (px != py) { p[px] = py; d[px] = d[c] - d[b]; } } else { if (b == c) { res++; } else if (px == py && (d[c] - d[b] - 1) % 3 == 0) { res++; } else if (px != py) { p[px] = py; d[px] = d[c] - d[b] - 1; } } } printf("%d\n", res); return 0;}
AC代码解释
数据结构初始化:
p
数组用于记录每个节点的父节点。d
数组用于记录每个节点的数据值。
find函数:
- 用于路径压缩,通过递归找到根节点,并将路径上的节点直接指向根节点,同时将路径权值累加到当前节点的数据中。
main函数:
- 首先读取输入,初始化父节点数组。
- 然后循环处理每个操作。
- 根据操作类型判断,通过
find
函数获取两个集合的根节点。 - 根据不同的条件更新父节点和数据值,积累结果。
条件判断逻辑:
- 判断节点是否超出范围,直接计数。
- 判断操作类型,分别处理路径压缩与合并。
该代码通过路径压缩和按秩合并实现了并查集算法,效率较高,排序数可以达到近乎线性的时间复杂度。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月29日 04时16分20秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
大数据在不同领域的应用
2019-03-11
页面置换算法
2019-03-11
推荐系统资料
2019-03-11
文件系统的层次结构
2019-03-11
减少磁盘延迟时间的方法
2019-03-11
vue(渐进式前端框架)
2019-03-11
权值初始化和与损失函数
2019-03-11
案例讨论
2019-03-11
传输层基本功能
2019-03-11
问题的计算复杂度:排序问题
2019-03-11
算法的伪码表示
2019-03-11
递推方程与算法分析
2019-03-11
主定理的应用
2019-03-11
动态规划算法的迭代实现
2019-03-11
最优装载问题
2019-03-11
最大团问题
2019-03-11
圆排列问题
2019-03-11
课程总结
2019-03-11
认识CMake及应用
2019-03-11
CMake的主体框架
2019-03-11