CF1284F New Year and Social Network
给定两棵n个点的树,然后要求从T1上删掉某一条边之后从T2上找一条边替换后使得T1仍然是一颗树,将这样的边视作匹配,求解最大匹配。
首先大胆猜测存在完美匹配,然后考虑利用归纳法证明,我们对
E
(
T
1
)
−
E
(
T
2
)
=
e
∈
T
1
∩
e
∉
T
2
E(T_1)-E(T_2)=e\in{T_1}\cap e\notin{T_2}
E(T1)−E(T2)=e∈T1∩e∈/T2
这个集合的大小进行归纳,当集合大小为0时显然两个树相同,然后可以每次找到这样的一条边,然后放到
T
2
T_2
T2上,那么一定能够构成一个环,那么中间一定有一条边连接两个不同的连通块,因为这两个端点属于不同连通块。
然后我们将这条边替换
T
2
T_2
T2上原来的边,就得到一个集合大小减一的问题,然后这条已经匹配的边在之后也不会再被用到,因为此时它唯一能够匹配的边就是相同的那一条,根据归纳法我们可以证明一定存在完美匹配。
所以我们就已经得到了一个暴力
O
(
n
2
)
O(n^2)
O(n2)的做法。
那么考虑优化,此时我们考虑枚举 T 2 T_2 T2中的边,那么同样对应 T 1 T_1 T1中的一个环,如果我们每次选择的都是叶子节点,那么此时一边的连通块就是唯一的,我们就可以很好找到对应边,然后考虑找到之后就得到了匹配,那么这样的边就没有用了,我们用并查集将其缩起来,然后对于 T 2 T_2 T2将原来的边删除,此时也不用加入新的边了。具体实现我们只需要dfs一边后序遍历即可。
然后考虑如何在 T 1 T_1 T1上找到对应边,那么相当于是找一个点到一个树上连通块的路径最后一条边,处理出连通块最上方的点,然后求解lca,如果lca深度小于最上方的点,那么就是最上方的点和它的父亲,否则我们可以通过倍增来求解了。
注意倍增细节:需要满足单调性,然后需要特判bz数组为0的情况。