BestCoder #74 B (div2)

来源:互联网 发布:sql怎么备份数据库 编辑:程序博客网 时间:2024/05/22 14:58
【题目来源】
题目传送门
【解题思路】

你可以选择分类讨论, 但是估计可能会写漏一些地方. 只要抽出新增边的端点作为关键点, 建立一个新图, 然后跑一遍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 longconst 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;}


1 0
原创粉丝点击