int n , m; int a[N]; int l , r , w; int f[N][N]; //由于本题数据范围较小,作者采用邻接矩阵存图 int q; int x , y , t;
voidfloyd(int k){ //Floyd主体函数 for(int i = 0; i <= n - 1; i ++){ for(int j = 0; j <= n - 1; j ++){ f[i][j] = min(f[i][j] , f[i][k] + f[k][j]); } } }
intmain(){ cin >> n >> m; for(int i = 0; i <= n - 1; i ++){ cin >> a[i]; } for(int i = 0; i <= n - 1; i ++){ for(int j = 0; j <= n - 1; j ++){ f[i][j] = 1e9; //初始化邻接矩阵 } } for(int i = 0; i <= n - 1; i ++){ f[i][i] = 0; } for(int i = 0; i <= m - 1; i ++){ cin >> l >> r >> w; f[l][r] = w; //由于是双向道路,所以需要建两次边 f[r][l] = w; } cin >> q; int now = 0; //now代表今天是第几天,用于枚举天数 for(int i = 0; i <= q - 1; i ++){ cin >> x >> y >> t; if(a[x] > t || a[y] > t){ //特判,如果起点或终点就没有重建,直接跳过循环 cout << "-1" <<endl; continue; } while(a[now] <= t && now < n){ floyd(now); now ++; } if(f[x][y] == 1e9){ //如果没有联通路,输出-1 cout << "-1" <<endl; } else{ cout << f[x][y] << endl; } } return0; } //Written By Payphone-X