食物链(并查集)
发布日期: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函数获取两个集合的根节点。
    • 根据不同的条件更新父节点和数据值,积累结果。
  • 条件判断逻辑:

    • 判断节点是否超出范围,直接计数。
    • 判断操作类型,分别处理路径压缩与合并。
  • 该代码通过路径压缩和按秩合并实现了并查集算法,效率较高,排序数可以达到近乎线性的时间复杂度。

    上一篇:bell_man算法
    下一篇:并查集(求连通块数量)

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月29日 04时16分20秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章