BestCoder #74 B (div2)

【题目来源】
题目传送门
【解题思路】

你可以选择分类讨论, 但是估计可能会写漏一些地方. 只要抽出新增边的端点作为关键点, 建立一个新图, 然后跑一遍floyd就好了. 复杂度大概O(62⋅m)O(6^2 \cdot m)O(62m)

【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;
}


你可能感兴趣的:(BestCoder #74 B (div2))