《怪物獵人物語2破滅之翼》滅盡龍BOSS打法攻略
阿新 • • 發佈:2021-07-19
Floyd求最短路
給定一個 n 個點 m 條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。
再給定 k 個詢問,每個詢問包含兩個整數 x 和 y,表示查詢從點 x 到點 y 的最短距離,如果路徑不存在,則輸出 impossible
。
資料保證圖中不存在負權迴路。
輸入格式
第一行包含三個整數 n,m,k
接下來 m 行,每行包含三個整數 x,y,z表示存在一條從點 x 到點 y 的有向邊,邊長為 z。
接下來 k 行,每行包含兩個整數 x,y表示詢問點 x 到點 y 的最短距離。
輸出格式
共 k 行,每行輸出一個整數,表示詢問的結果,若詢問兩點間不存在路徑,則輸出 impossible
資料範圍
1≤n≤200
1≤k≤n2
1≤m≤20000
圖中涉及邊長絕對值均不超過 10000
輸入樣例:
3 3 2
1 2 1
2 3 2
1 3 1
2 1
1 3
輸出樣例:
impossible
1
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 210, INF = 1e9; int n, m, Q; int d[N][N]; void floyd() { for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } } } int main() { cin >> n >> m >> Q; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j) { d[i][j] = 0; } else { d[i][j] = INF; } } } while (m--) { int a, b, w; cin >> a >> b >> w; d[a][b] = min(d[a][b], w); } floyd(); while (Q--) { int a, b; cin >> a >> b; if (d[a][b] > INF / 2) { puts("impossible"); } else { cout << d[a][b] << endl; } } return 0; }