题意:给你一个基环树,树上的边有各种颜色,每次操作有两种:
①修改一条边的颜色
②询问这个图有多少色块(相同颜色的边公用一个点,则为一块)
题解:(由于一遍一遍的改,代码很不精简=。=)
首先,我们可以考虑修改树上的边那么有7种情况:(假设边原来的颜色为a,修改后为b)
①边的两端的都存在颜色为a的边,修改后边的两端都存在颜色为b的边,则贡献为0。
②边的两端的都存在颜色为a的边,修改后边的两端有一端存在颜色为b的边,则贡献为1。
③边的两端的都存在颜色为a的边,修改后边的两端都不存在颜色为b的边,则贡献为2。
④边的两端有一端存在颜色为a的边,修改后边的两端都存在颜色为b的边,则贡献为-1。
⑤边的两端都不存在颜色为a的边,修改后边的两端都存在颜色为b的边,则贡献为-2。
⑥边的两端都不存在颜色为a的边,修改后边的两端有一端存在颜色为b的边则贡献为-1。
⑦边的两端有一端存在颜色为a的边,修改后边的两端都不存在颜色为b的边,则贡献为1。
其他情况贡献均为0。
然后我们考虑环上的情况
假如环是如下情况:
当加入颜色不是1的边时需要比之前条件的贡献-1
假如环时如下情况
当加入颜色是1的边时需要比之前条件的贡献+1
最后,与点相邻的边就直接加入set维护,Tarjan找基环,mp记录边的情况mp<0代表该边时环边。
AC代码:
#include
#include
#include
#include
#include