NC224751. 逛漫展
描述
输入描述
第一行三个整数 N M Q (N个场馆 M条人行道 Q次查询)第二行N个整数,为开馆时间,以及据上文,给出的数据以下M行 每行三个整数 A B W (表示场馆A与场馆B之间存在一条长度W的人行道)以下Q行 每行三个整数 A B T (表示要查询场馆A与场馆B之间在时间T的最短路径长度)
输出描述
共Q行,对每一个询问输出对应的答案如果T时间 A,B未互通则输出-1
示例1
输入:
4 4 4 1 2 3 4 1 2 1 3 1 1 2 3 2 0 1 4 2 1 2 3 1 2 1 2 3 0 3 4
输出:
-1 -1 1 5
C++(clang++ 11.0.1) 解法, 执行用时: 191ms, 内存消耗: 1496K, 提交时间: 2022-10-19 22:46:27
#include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; int n, m, q; int T[205], dis[205][205]; void Floyd(int k) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); } } } int main() { cin >> n >> m >> q; for (int i = 0; i < n; i++) { cin >> T[i]; } memset(dis, inf, sizeof dis); int a, b, w; for (int i = 0; i < m; i++) { cin >> a >> b >> w; dis[a][b] = dis[b][a] = min(w, dis[a][b]); } for (int i = 0; i < n; i++) { dis[i][i] = 0; } int k = 0; while (q--) { cin >> a >> b >> w; while (T[k] <= w && k < n) { Floyd(k++); } if (T[a] > w || T[b] > w) { puts("-1"); } else { if (dis[a][b] == inf) puts("-1"); else cout << dis[a][b] << '\n'; } } return 0; }