zoukankan      html  css  js  c++  java
  • bc 74 Shortest Path

      之前想了一种枚举方法, 结果比赛完后没过终测, 题解的方法是这样的, 对于新加的六个边我们新建一个图, 用floyd跑出每两个点之间的最短路径, 在计算l - r的距离的时候我们就可以枚举36种可能求出最优解即可。代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <cmath>
    #include <iostream>
    
    using namespace std;
    typedef long long LL;
    int n, m;
    int a[10];
    int d[10][10];
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d%d", &n, &m);
            for(int i=1; i<=6; i++)
                scanf("%d", &a[i]);
            for(int i=1; i<=6; i++)
                for(int j=1; j<=6; j++)
                d[i][j] = abs(a[i]-a[j]);
            if(a[1]!=a[2]) d[1][2] = d[2][1] = 1;
            if(a[3]!=a[4]) d[3][4] = d[4][3] = 1;
            if(a[5]!=a[6]) 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 res = 0;
            for(int i=1; i<=m; i++)
            {
                int l, r;
                scanf("%d%d", &l, &r);
                LL dis = abs(r-l);
                for(int u=1; u<=6; u++)
                for(int v=1; v<=6; v++)
                    dis = min(dis, (LL)abs(a[u]-l)+d[u][v]+abs(r-a[v]));
                res = (res+dis*i)%(1000000000+7);
            }
            cout<<res<<endl;
        }
        return 0;
    }
  • 相关阅读:
    生于忧患,死于安乐
    【网络流24题】骑士共存问题
    【网络流24题】最长不下降子序列问题
    【网络流24题】太空计划问题
    SG函数
    【网络流24题】餐巾计划问题
    【APIO2019】奇怪装置
    【HEOI2016/TJOI2016】游戏
    【SDOI2015】星际战争
    【CQOI2009】跳舞
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5246676.html
Copyright © 2011-2022 走看看