【带权并查集】食物链 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.