CF1310D解题报告
随机算法用到这步也是绝了
题意
\(n\leq 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\n", ans);
return 0;
}

浙公网安备 33010602011771号