CF1310D解题报告

随机算法用到这步也是绝了

题意

(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;
}
原文地址:https://www.cnblogs.com/JHDHJjuruo/p/12636812.html