题意:每个村庄有自己重建的时间,重建好才能通车。
询问第几天x到y的距离最小是多少。【有可能还没建好没通车】
题解:
考虑Floyd算法的核心->利用中转点进行更新。
那么这里只需要对于询问,询问之前建好的村庄依次更新即可。
题目给的输入数据都是已经排过序的。
代码:
#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
const int MAXN = 10005;
int N,M;
int T[MAXN];
int dp[MAXN][MAXN];
void update(int k){
FOR(i,1,N)FOR(j,1,N){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
void solve(){
cin>>N>>M;
FOR(i,1,N)scanf("%d",&T[i]);
FOR(i,1,N)FOR(j,1,N)
if(i==j)dp[i][i]=0;
else dp[i][j]=1000510005;
FOR(i,1,M){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
x++,y++;
dp[x][y]=dp[y][x]=w;
}
int Q;cin>>Q;
int now=1;//记录当前更新到哪个中转点
FOR(i,1,Q){
int x,y,t;
scanf("%d%d%d",&x,&y,&t);
x++,y++;
while(now<=N&&T[now]<=t){
update(now++);
}
if(T[x]>t||T[y]>t)cout<<"-1"<<endl;//还没有建好的话通车了也没用。而一开始是已记录了
//dp[x][y]最小也有已有道路长度,而此时应该输出-1.
else if(dp[x][y]!=1000510005)
cout<<dp[x][y]<<endl;
else cout<<"-1"<<endl;
}
}
int main(){
solve();
}