题解 LuoguP2910 【[USACO08OPEN]寻宝之路Clear And Present Danger】

题目意思解释一下:那个序列就是求相邻两个节点的最短路之和。

然后跑多源最短路(Floyd)就OK了。

\(Code:\)

#pragma GCC diagnostic error "-std=c++11"
#include <iostream>
#include <cstdio>
#define inf 99999999
using namespace std;
template<class T>void r(T &a)//快读
{
    T s=0,w=1;a=0;char ch=getc(stdin);
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getc(stdin);}
    while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getc(stdin);}
    a=w*s;
}
template<class T,class... Y>void r(T& t,Y&... a){r(t);r(a...);}
int dis[110][110],arr[10010];
int main()
{
    int n,m,ans=0;
    r(n,m);
    for(int i=1;i<=m;i++)
        r(arr[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            r(dis[i][j]);
    for(int k=1;k<=n;k++)//Floyd
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
    for(int i=2;i<=m;i++)//求答案
        ans+=dis[arr[i-1]][arr[i]];
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Naive-Cat/p/10664086.html
今日推荐