信息传递
P2661 [NOIP2015 提高组] 信息传递
在游戏里每人都有一个固定的信息传递对象,其中,编号为 \(i\) 的同学的信息传递对象是编号为 \(T_i\) 的同学。
可以看出形成了基环树森林,且都是从边缘指向环上的点。
法1
直接从每个点出发遍历,直到遇到遍历过的点:若是本轮的,计算环长,然后停止。
https://www.luogu.com.cn/record/157133428
法2
记 \(i,T_i\) 的传递为 \((a,b)\)。由于每个点只有一个出边,所以按照 \(a\rightarrow b\) 合并并查集,\(a\) 原来必定是根。(自己是第一次合并,子节点不可能有两条出边)。
如果出现环,由于 \(a\) 是根,只需要计算 \(b\) 的深度 \(+1\)。
需要维护每个点到根的距离,带权并查集。