题解:AT_abc369_e [ABC369E] Sightseeing Tour

解题思路

纯粹的暴力题,赛时脑子抽了没写出来

我们发现 \(n\)\(K_i\) 的范围都很小,所以考虑暴力模拟。

先用 Floyd 算法求出任意两点之间的最短距离,\(i\)\(j\) 的最短距离存放在 \(a_{i, j}\) 里。

接下来,再枚举每一座桥的方向,里面再枚举经过每一座桥的顺序。

时间复杂度:\(O(q\times 2^{K_i}\times K_i!)\)

核心代码

Floyd();
while (q -- ) {
	int k;
	cin >> k;
	rep(i, 0, k - 1) {
		idx[i] = i;
		cin >> b[i];
	}
	int res = inf;
	rep(i, 0, (1 << k) - 1) do{//枚举桥的方向,0表示正向,1表示反向
		int s = 1, now = 0;
		rep(j, 0, k - 1) {
			int u = e[b[idx[j]]].u, v = e[b[idx[j]]].v;
			if (i >> j & 1) swap(u, v);//判读第j座桥是否要反转
			now += a[s][u] + e[b[idx[j]]].w;
			s = v;
		}
		res = min(res, now + a[s][n]);//更新答案
	} while (next_permutation(idx, idx + k));//下一个顺序
	cout << res << endl;
}
posted @ 2024-10-25 14:43  zla_2012  阅读(1)  评论(0编辑  收藏  举报