给你三个 正整数 n 、x 和 y 。
在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1 <= i < n ,都存在一条街道连接编号为 i 的房屋与编号为 i + 1 的房屋。另存在一条街道连接编号为 x 的房屋与编号为 y 的房屋。
对于每个 k(1 <= k <= n),你需要找出所有满足要求的 房屋对 [house1, house2] ,即从 house1 到 house2 需要经过的 最少 街道数为 k 。
返回一个下标从 1 开始且长度为 n 的数组 result ,其中 result[k] 表示所有满足要求的房屋对的数量,即从一个房屋到另一个房屋需要经过的 最少 街道数为 k 。
注意,x 与 y 可以 相等 。
提示:
2 <= n <= 100
1 <= x, y <= n
核心代码
1 2 3 4 5 6 7 8 9 10 11 12 13
for (k = 1; k < n + 1; k++) { for (i = 1; i < n + 1; i++) { for (j = 1; j < n + 1; j++) { // 如果通过中间节点 k 能够缩短从节点 i 到节点 j 的路径长度,则更新路径长度 int t = a[i][k] + a[k][j]; if (t < a[i][j]) a[i][j] = t; } } }
// 使用弗洛伊德算法计算所有节点之间的最短路径长度 for (k = 1; k < n + 1; k++) { for (i = 1; i < n + 1; i++) { for (j = 1; j < n + 1; j++) { // 如果通过中间节点 k 能够缩短从节点 i 到节点 j 的路径长度,则更新路径长度 int t = a[i][k] + a[k][j]; if (t < a[i][j]) a[i][j] = t; } } }
// 统计每个节点对的最短路径长度出现的次数 int *ans = (int *)malloc(sizeof(int) * (n + 1)); for (int i = 0; i < n; i++) { ans[i] = 0; } for (i = 1; i < n + 1; i++) { for (j = 1; j < n + 1; j++) { // 统计除了节点自身以外的所有最短路径长度出现的次数 if (i != j) ans[a[i][j] - 1]++; } } *returnSize = n;