CF1508C题解
设题目给定的边为实边,未给出的为虚边
容易发现2个性质:
1.设所有实边的权值异或和为\(s\),则令一条未给出的边的权值为s,其他为0最优
考虑求出虚边构成的连通块,这是个经典问题,可以用bfs+set+map(或者bfs+链表+hash表)完成
2.对于所有虚边构成的连通块,如果存在一个连通块中虚边不构成一棵树,则可以把所有虚边的权值视为0
分2类讨论:
1.如果存在一个连通块中虚边不构成一棵树,则把所有虚边构成的连通块视为一个点,然后在该新图上运行mst
2.如果所有连通块中虚边都构成一棵树,则可以考虑先把所有虚边的权值设为0,然后和实边一起运行mst
容易证明,此时mst的时间复杂度为\(O(m\log_2m)\)
然后考虑把一条边的权值赋值为\(s\),此时会有最多一条边会替换该边。
可以按边权从小到大枚举权值\(<s\)的边,设端点为\(x,y\),然后观察树上\((x,y)\)路径是否包含虚边,可以用树上差分判定
如果包含则进行替换,退出此过程并重新计算生成树的权值后输出。
通过对替换后的新图分类讨论可以证明正确性

浙公网安备 33010602011771号