【题目来源】
【解题思路】
你可以选择分类讨论, 但是估计可能会写漏一些地方. 只要抽出新增边的端点作为关键点, 建立一个新图, 然后跑一遍floyd就好了. 复杂度大概O(62⋅m)O(6^2 \cdot m)O(62⋅m)
【AC代码】
#include <stdio.h>
#include <string.h>
#include <vector>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define CLE(a,b) memset(a,b,sizeof(a))
#define MEC(a,b) memcpy(a,b,sizeof(a))
#define PI acos(-1)
#define ll long long
const ll MOD = 1000000007;
void solve()
{
int n,m;
scanf("%d%d",&n,&m);
int a[6];
for(int i=0; i<6; i++) scanf("%d",&a[i]);
int maze[6][6];
for(int i=0; i<6; i++)
{
for(int j=0; j<6; j++)
{
maze[i][j] = abs(a[i]-a[j]);
}
}
for(int j=0; j<3; j++)
{
int i = j*2;
maze[i][i+1] = min(1,maze[i][i+1]);
maze[i+1][i] = maze[i][i+1];
}
for(int i=0; i<6; i++)
for(int j=0; j<6; j++)
for(int k=0; k<6; k++)
if(maze[j][k]>maze[j][i]+maze[i][k])
maze[j][k] = maze[j][i]+maze[i][k];
ll ans = 0;
for(ll i=1; i<=(ll)m; i++)
{
int u,v;
scanf("%d%d",&u,&v);
ll t = abs(u-v);
for(int p=0; p<6; p++)
{
for(int q=0; q<6; q++)
{
ll tmp = abs(u-a[p])+abs(v-a[q])+maze[p][q];
t = min(tmp,t);
}
}
ans = (ans+(i*t)%MOD)%MOD;
}
printf("%I64d\n",ans);
}
int main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);
int T;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}