这道题通过floyd算法的思想,就是枚举点k,用于更新两点之间的距离。
就是每次利用新修复的城市节点去更新两点之间的最短路
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=205;
int a[maxn],map[maxn][maxn];
int n,m;
void update(int k)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[j][i]=map[i][k]+map[k][j];
return ;
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j]=1e9;
for(int i=0;i<n;i++)
map[i][i]=0;
int x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
map[x][y]=z; map[y][x]=z;
}
int q,now=0;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d%d",&x,&y,&z);
while(a[now]<=z && now<n)
{
update(now);
now++;
}
if(a[x]>z || a[y]>z) printf("-1\n");
else
{
if(map[x][y]==1e9) printf("-1\n");
else printf("%d\n",map[x][y]);
}
}
return 0;
}