题解: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;
}