我刚刚在这里阅读了一篇关于如何使用动态编程找到最短哈密尔顿路径的文章http://codeforces.com/blog/entry/337。
虽然伪代码有效,但我不明白为什么我必须在集合上使用xor运算符和2 ^ i。
为什么不直接从位掩码中减去当前的被访城市?为了使算法具有魔力,xor与集合有什么作用?
这里要澄清的是用java编写的伪代码:
public int calculate(int set, int i){
if(count(set) == 1 && (set & 1<<i) != 0){
return 0;
}
if ( dp[set][i] != infinity){
return dp[set][i];
}
for (int city=0;city<n;city++){
if((set & 1<<city) == 0) continue;
dp[set][i] = Math.min(dp[set][i], calculate(set ^ 1<<i, city) + dist[i][city]);
}
return dp[set][i];
}
答案 0 :(得分:1)
找到我的问题的解决方案,^是一个点翻转。因此,如果您有一个位掩码并在掩码上使用xor运算符,则可以在该位置上翻转位。例如。 1010 ^(1 <1)导致1000。 对于1000 ^(1 <1)= 1010也是如此。
减法也有效,但是对于xor算子,你肯定知道你只触摸那个地方的位,而没有别的。因此,图像1000-(1&lt; 1)将导致完全不同的东西。因此,如果您100%确定在1处的位置i,但是xor更安全,则可以使用减法,并且可以使用。