#4614. 弗洛伊德(Floyd-Warshall)算法练习2

弗洛伊德(Floyd-Warshall)算法练习2

【题目描述】

给定一个有 nn 个节点的无向图,节点编号为 1n1 \sim n,图中有 mm 条带权边,边权为正整数(1w10001 \le w \le 1000)。请使用 Floyd-Warshall 算法完成以下任务:

  1. 计算任意两点之间的最短路径长度;
  2. 额外输出一个 n×nn \times n 的矩阵,标记两点之间是否存在路径(存在输出 1,不存在输出 0,自身到自身输出 1);
  3. 若两点间无路径,最短路径长度输出 -1

【输入格式】

第一行:两个整数 n,mn, m1n2001 \le n \le 2000mn×n0 \le m \le n \times n) 接下来 mm 行:每行三个整数 u,v,wu, v, w,表示节点 uuvv 之间有一条无向边,边权为 ww

【输出格式】

第 1 ~ nn 行:每行 nn 个整数,为任意两点的最短路径长度矩阵 第 n+1n+1 行:空行(分隔两个矩阵) 第 n+2n+2 ~ 2n+12n+1 行:每行 nn 个整数,为任意两点的路径存在性矩阵

每一行的最后1个数字后无空格

【样例输入】

3 3
1 2 1
2 3 2
1 3 5

【样例输出】

0 1 3
1 0 2
3 2 0

1 1 1
1 1 1
1 1 1

【练习要点】

  1. 掌握无向图的处理(边 uvu \leftrightarrow v 双向赋值,dist[u][v] = dist[v][u] = w
  2. 学会新增辅助矩阵(路径存在性矩阵),并在 Floyd 过程中同步更新
  3. 理解无向图中“可达性”的传递性(若 ii 可达 kkkk 可达 jj,则 ii 可达 jj