题解 P1119 【灾后重建】
点建立需要时间,再加上看到数据范围为
#include<bits/stdc++.h>
using namespace std;
int n,t,m,dis[210][210],date[210],now=0;
void initialize() {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) dis[i][j]=1e9;
}
for(int i=0;i<n;i++) dis[i][i]=0;
}
void Floyd(int k) {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[j][i]=dis[i][k]+dis[k][j];
}
}
}
int main() {
cin>>n>>m;
initialize();
for(int i=0;i<n;i++) cin>>date[i];
for(int i=0;i<m;i++) {
int x,y;
cin>>x>>y;
cin>>dis[x][y];
dis[y][x]=dis[x][y];
}
cin>>t;
while(t) {
int x,y,t_i;
cin>>x>>y>>t_i;
while(date[now]<=t_i&&now<n) {
Floyd(now);
now++;
}
if(dis[x][y]==1e9||date[x]>t_i||date[y]>t_i) cout<<-1<<endl;
else cout<<dis[x][y]<<endl;
t--;
}
return 0;
}