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

· · 题解

题解好少,我来一发C++的弗洛伊德

提交前发现答案错了,想了想又改了回来,可能有人也会这样错,在这里说一下错的思路

#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 300000
using namespace std;
int n,m,a[maxn],dis[110][110],tot=0;
int main()
{
    ios::sync_with_stdio(false);//cin快读
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        cin>>a[i];//记录必须经过的路径
    }
    memset(dis,999999,sizeof(dis));//初始化一个大值,后面进行择优
    for(int i=1;i<=n;++i)
    {
        for(int x,j=1;j<=n;++j)
        {
            cin>>x;
            dis[i][j]=x;
        }
    }
    for(int k=1;k<=n;++k)
     for(int i=1;i<=n;++i)
      for(int j=1;j<=n;++j)
       if(dis[i][j]>dis[i][k]+dis[k][j])
        dis[i][j]=dis[i][k]+dis[k][j];//弗洛伊德就这样写,k做中介,实在不明白背过
    tot=dis[1][a[1]];//sum记录步数,第一个必经点是要从1来的
    for(int i=2;i<=m;++i)//1已经确定了,从2更新
    {
        tot+=dis[a[i-1]][a[i]];//每次从前面那个点到现在这个点最短路,更新答案
    }
    printf("%d",tot);
    return 0;
}