随机算法用到这步也是绝了
题意
(nleq 80)个点完全有向连通图,走(k)步回到起点(1)且没有奇环,求最小代价
题解
没有奇环很容易(个屁嘞)想到二分图,于是每次对每个点随机染色,然后用(O(n^2k))的(DP)轻松求出当前条件下的最小代价,考虑如果我们已经知道了最终的一条最优路径,这上面最多有(k)个点,那么这(k)个点在一种染色方案中黑白相间的概率是(1/2^{k-1}),这样重复(5000)次后不正确答案的概率就是((511/512)^{5000}approx0.000056845461206)!!!!
Code
#include <bits/stdc++.h>
using namespace std;
long long ans = 1e18, f[13][83];
int n, k, mp[83][83], col[83];
int main() {
srand(time(0));
scanf("%d %d", &n, &k);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &mp[i][j]);
for(int _ = 1; _ <= 5000; _++) {
for(int i = 1; i <= n; i++) {
col[i] = rand() % 2;
}
memset(f, 0x3f, sizeof(f));
f[0][1] = 0;
for(int i = 1; i <= k; i++)
for(int j = 1; j <= n; j++)
for(int k = 1; k <= n; k++)
if(col[j] != col[k]) f[i][j] = min(f[i][j], f[i - 1][k] + mp[k][j]);
ans = min(ans, f[k][1]);
}
printf("%lld
", ans);
return 0;
}