思路
首先将题目抽象得到是一个多源汇的最短路问题,所以肯定是floyd算法,但是与最基本的floyd算法不同的是,加入了新的一维时间t,需要对其进行关注
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=210;
const int M=40010;
const int Q=50010;
int map[N][N];
int reB[N];
int n,m,q;
void floyd(int k,int t){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
//这个地方不需要判断是否已经修建好
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
map[j][i]=map[i][j];
}
}
}
int main(){
//读入村庄数目和公路数量
memset(map,0x3f,sizeof map);
memset(reB,0,sizeof reB);
cin>>n>>m;
//读入每个村庄的重建时间
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
map[i][i]=0;
}
}
}
for(int i=0;i<n;i++){
int tempT;
cin>>tempT;
reB[i]=tempT;
}
//读入道路长度
int x,y,w;
for(int i=0;i<m;i++){
cin>>x>>y>>w;
map[x][y]=w;
map[y][x]=w;
}
cin>>q;
int t;
int count=0;
for(int i=0;i<q;i++){
cin>>x>>y>>t;
//这里必须要判断cnt<n,否则永远无法获得AC
while(t>=reB[count]&&count<n){
floyd(count,t);
count++;
}
if(reB[x]>t||reB[y]>t||map[x][y]>0x3f3f3f3f/2){
cout<<-1<<endl;
}
else{
cout<<map[x][y]<<endl;
}
}
return 0;
}