"""
https://www.lanqiao.cn/problems/1121/learning/?page=1&first_category_id=1&name=%E8%93%9D%E6%A1%A5%E5%85%AC%E5%9B%AD
"""
"""
当加入第k个点作为i到j的中间点:
dp[k][i][j] = min(dp[k - 1][i][j], dp[k - 1][i][k] + dp[k - 1][k][j])
该动态规划的状态转移方程可以利用滚动数组优化第一维度:
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])
枚举所有k, 作为中间点优化最短路
初始化: 如果<i,j>无边, 则dp[i][j] = INF, 有边则等于边权
dp[i][i] = 0
"""
n, m, q = map(int, input().split())
INF = 1e18
# 用邻接矩阵来存放图
dp = [[INF] * (n + 1) for _ in range(n + 1)]
# 初始化
for i in range(1, n + 1):
dp[i][i] = 0
for _ in range(m):
u, v, w = map(int, input().split())
# u和v之间可能会有多条边, 取其中最短的边
dp[u][v] = dp[v][u] = min(dp[u][v], w)
# 枚举所有中间点k
for k in range(1, n + 1):
for i in range(1, n + 1):
for j in range(1, n + 1):
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])
for _ in range(q):
u, v = map(int, input().split())
if dp[u][v] == INF:
print(-1)
else:
print(dp[u][v])
Floyd算法: 用于解决多源最短路, 可以求解任意两点的最短路, 存在负权边也可以(存在负权环则无法求解问题)
负权环: 所有边的权值之和为负数的环