XorTravelingSalesman

作者:陈通 徐明宽

关键词:异或 记忆化搜索

试题来源

Topcoder SRM 556 Div1 250

试题大意

给一个包含个点的图,两点间可能没有边或有一条双向边相连,边用数组表示。点的编号为,每个点有一个权值,第个点的权值为。你从号点出发开始旅行,可以沿着边走到相邻的点,一个点可以经过多次,你可以在任何一点结束旅行。初始时,你在号点且你的收益为,你每经过一个点,你的收益就会与当前点的权值异或。你的最终收益为你结束旅行时的收益。求最终收益的最大值。

算法介绍

算法一

此题可以用记忆化搜索求解。定义状态,表示是否存在某一时刻你处在号点,且当前权值为。初值。对每个为的状态进行扩展,若状态,则对于每一个与有边相连的点,有。最终答案即为使得成立的最大的

易知状态总数为,在搜索的过程中每个状态只会扩展一次,所以总时间复杂度为

算法二

先说结论:当号点的度为时,显然答案为;否则,对于任意一个号点所在连通块的子集,可以构造一条路径,使得最终收益为这个子集里的点权的异或和。

证明:初始时在号点且收益为。对于任意点目标集合且,存在一条从点到点的路径,于是可以从点沿相同的路径走到点再走回点,这样收益就异或上了。处理完除了号点以外的所有目标集合中的点以后,如果收益不等于目标集合里的点权异或和,那么收益一定等于目标集合里的点权异或和与的异或,此时可以任取一个与号点有边直接相连的点,从点走到点再走到点再走到点,这样收益会依次异或上,也就满足要求了。

有了这个结论以后,这道题就转化成了经典的最大异或和问题(给定个数,选取若干个数使异或和最大)(当号点的度为时,由于非负,所以答案也是最大异或和),可以用高斯消元(按位贪心)的方法在的时间复杂度内解决。

results matching ""

    No results matching ""