做了一个蓝桥杯的题,最后一个测试总是超时,不知道如何优化才可以不超时
问题描述
给定n个结点两两之间的单向边的长度,求两两之间的最短路径。输入格式
输入第一行包含一个整数n,表示点数。接下来n行,每行包含n个整数,第i行表示第i个点到每个点 的边的长度,如果没有边,则用0表示。
输出格式输出n行,第i行表示第i个点到其他点的最短路径长度,如果没有可达的路径,则输出-1。
样例输入
30 1 0
0 0 6
0 2 0
样例输出
0 1 7
-1 0 6
-1 2 0
数据规模和约定 1<=n<=1000,0<边长<=10000。
这是我写的代码,通不过最后一个测试
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] targetArr = new int[n][n];
int temp;
for(int i = 0;i<n;i++) {
String[] strs= br.readLine().split(" ");
for(int j = 0;j<n;j++) {
temp = Integer.parseInt(strs[j]);
if(temp==0&&i!=j)
targetArr[i][j] = -1;
else
targetArr[i][j] = temp;
}
}
floyd(targetArr, n);
for(int i = 0;i<n;i++) {
for(int j = 0;j<n;j++) {
System.out.print(targetArr[i][j]+" ");
}
System.out.println();
}
}
/**
* 弗罗伊德
* @param targetArr 目标数组
* @param n 数组的宽度和长度
*/
public static void floyd(int[][] targetArr,int n) {
int next1,next2;
for(int k = 0;k<n;k++) {
for(int i = 0;i<n;i++) {
if(i==k||(next1 = targetArr[i][k])<0)
continue;
if(next1<0)
continue;
for(int j = 0;j<n;j++) {
if(j==k||i==j||(next2 = targetArr[k][j])<0)
continue;
if(targetArr[i][j]<0)
targetArr[i][j] = next1+next2;
else
targetArr[i][j] = Math.min(targetArr[i][j], next1+next2);
}
}
}
}
}

求助呀大佬们,怎么才能继续优化!!
本文探讨了一位开发者在解决蓝桥杯最短路径问题时遇到超时问题,分享了如何通过优化Floyd算法并调整代码结构来避免超时,提供针对性的优化策略和实例代码修改建议。
8537

被折叠的 条评论
为什么被折叠?



