题解 P2910 【[USACO08OPEN]寻宝之路Clear And Present Danger】
dan_daning_L · · 题解
这里是蒟蒻发的第一篇Floyed蒟蒻题解
这是一道纯Floyed题,所以一定会被Dijkstra和SPFA的大佬骂死虐得很惨
因为Floyed最短路算法连我这样的蒟蒻都能较好理解,所以是萌新必备,但时间复杂度较大O(N^3),所以不如其他方法运用广泛。
本题解法
首先利用Floyed算法计算出每两座岛之间的最小伤害(最短路),之后将相邻每两个目的地岛屿的最短路相加即是最终答案。
献上来自蒟蒻的双膝代码
#include <bits/stdc++.h> //懒人必备
using namespace std;
int main()
{
long long f[101][101],a[10001],n,m,i,k,j,ans=0;
cin>>n>>m; //本人才学会的输入
for (i=1;i<=m;i++)
cin>>a[i];
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
cin>>f[i][j];
for (k=1;k<=n;k++) //本人才学会的Floyed
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (f[i][j]>f[i][k]+f[k][j])
f[i][j]=f[i][k]+f[k][j]; //if以k点为中继点i到j的距离小于i到j的直线距离,则交换
for (i=1;i<m;i++)
ans+=f[a[i]][a[i+1]]; //累加相邻2个目的地的最短路径
cout<<ans; //本人才学会的输出
return 0;
}
Floyed详见一本通 or 这里