1. 程式人生 > 資訊 >三星 Galaxy Z Fold3 官方保護殼渲染圖曝光:確認支援 S Pen

三星 Galaxy Z Fold3 官方保護殼渲染圖曝光:確認支援 S Pen

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;

}