题解
题意:n个点,第i个点和第i+1个点之间有一条边,现在再告诉你6个点,添3条边,边权都为1,m次询问,问s与t之间的最短路
因为s与t之间的最短路,要么是这两个点本身之间的距离,要么是通过这6个点,
所以Floyd跑一下这6个点之间的最短路,dp找最小的那条路,
dis = min(dis, abs(u - a[i]) + d[i][j] + abs(v - a[j]))
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
int a[10];
ll d[10][10];
int n, m, K;
int main() {
ios::sync_with_stdio(0);
int T;
cin >> T;
for (int cs = 1; cs <= T; ++cs) {
cin >> n >> m;
for (int i = 1; i <= 6; ++i) {
cin >> a[i];
}
for (int i = 1; i <= 6; ++i) {
for (int j = 1; j <= 6; ++j) {
d[i][j] = abs(a[i] - a[j]);
}
}
d[1][2] = d[2][1] = d[3][4] = d[4][3] = d[5][6] = d[6][5] = 1;
for (int k = 1; k <= 6; ++k) {
for (int i = 1; i <= 6; ++i) {
for (int j = 1; j <= 6; ++j) {
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
ll ans = 0;
for (int k = 1, u, v; k <= m; ++k) {
cin >> u >> v;
ll d1 = abs(u - v);
for (int i = 1; i <= 6; ++i) {
for (int j = 1; j <= 6; ++j) {
d1 = min(d1, 1ll * abs(u - a[i]) + d[i][j] + abs(v - a[j]));
}
}
ans = (ans + 1ll * k * d1 % mod) % mod;
}
printf("%lld\n", ans);
}
return 0;
}