题解 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;
}