# 背景

给定一个 nn 个点 mm 条边的有向图,图中可能存在 重边自环边权可能为负数
再给定 kk 个询问,每个询问包含两个整数 xxyy,表示查询从点 xx 到点 yy 的最短距离,如果路径不存在,就输出 impossible

# 思路

FloydFloyd 本质上是动态规划,通过三层循环分别枚举中间点起点终点暴力求解
利用二维数组存图
d[起点][终点] = min(d[起点][终点], d[起点][中间点] + d[中间点][终点]
理解较容易,代码如下

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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]);
}

void solve () {
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
d[i][j] = (i == j ? 0 : 0x3f3f3f3f);

for (int i = 1, a, b, c; i <= m; i++)
cin >> a >> b >> c, d[a][b] = min(d[a][b], c);

floyd();

int x, y;
while (k--) {
cin >> x >> y;
if (d[x][y] > 0x3f3f3f3f / 2)
cout << "impossible\n";
else
cout << d[x][y] << "\n";
}
}