求助怎么继续优化Floyd

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

做了一个蓝桥杯的题,最后一个测试总是超时,不知道如何优化才可以不超时

问题描述  
 
给定n个结点两两之间的单向边的长度,求两两之间的最短路径。

输入格式   
输入第一行包含一个整数n,表示点数。接下来n行,每行包含n个整数,第i行表示第i个点到每个点 的边的长度,如果没有边,则用0表示。
输出格式

输出n行,第i行表示第i个点到其他点的最短路径长度,如果没有可达的路径,则输出-1。

样例输入
3

0 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);
				}
			}
		}
	}
}


求助呀大佬们,怎么才能继续优化!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值