【带权并查集】食物链 POJ - 1182

食物链 POJ - 1182

思路:

因为和这题差不多,所以就只简单地写一下关键点。

路径压缩的关系维护:

A与fa[A]的关系 fa[A]与root的关系 A与root的关系
同类【0】 同类【0】 同类【0】
同类【0】 吃root【1】 吃root【1】
同类【0】 被root吃【2】 被root吃【2】
吃fa[A]【1】 同类【0】 吃root【1】
吃fa[A]【1】 吃root【1】 被root吃【2】
吃fa[A]【1】 被root吃【2】 同类【0】
被fa[A]吃【2】 同类【0】 被root吃【2】
被fa[A]吃【2】 吃root【1】 同类【0】
被fa[A]吃【2】 被root吃【2】 吃root【1】

由表可以看出是前两个的和对3取模的结果

\[rela[A]=(rela[A]+rela[fa[A]])\%3 \]

合并时的关系维护:

(0:与后者同类;1:吃后者;2:被后者吃。)

A与root[A]的关系 B与root[B]的关系 A与B的关系r root[A]与root[B]的关系
1 0 2 1
2 1 1 0
0 2 0 2

(表中仅列出了其中几种情况,其它省略)

由此可观察出关系式:(感觉不太明显啊……)

\[rela[root A]=(rela[B]-rela[A]+r+3)\%3 \]

为避免出现负数对3取模,括号内加上3.

查询时的关系计算:

已知A,B在同一个集合内(即已知A与root,B与root的关系),由此推出A与B的关系,再与给出的关系比较判断后者是否正确即可

A与root的关系 rela[A] B与root的关系 rela[B] A与B的关系 relation
0 2 1
1 1 0
2 0 2

(表中仅列出了其中几种情况,其它省略)

由此可观察出关系式:

\[relation=(rela[A]-rela[B]+3)\%3 \]

为避免出现负数对3取模,括号内加上3.

posted @ 2020-08-10 02:18  StreamAzure  阅读(109)  评论(0编辑  收藏  举报