正在复习数据结构,以前只是拿纸和笔在草纸是模拟计算过程,这次把算法用java实现以下。存储结构采用邻接矩阵,dist[i]为起点到vi的最短距离,_final[i]数组为vi是否已经求得了最短路径。不可达的路径长度为Integer类型允许的最大值。程序输入的时候,权值不能为负,并且要小于Integer允许的最大值。
程序已开始输入顶点数量,边数量,然后按“起点 终点 权值”的顺序输入,顶点编号从1开始
程序将输出从v1到其他顶点的最短路径。
import java.util.Scanner;
public class Main {
static int shortPath(int startV, int[][] relations) {
boolean[] _final = new boolean[relations.length];
int[] dist = new int[relations.length];
int vj = startV;
for (int i = 1; i < relations.length; i++) {
dist[i] = relations[startV][i];
_final[i] = false;
}
for (int w = 1; w < relations.length; w++) {
int min = Integer.MAX_VALUE;
for (int i = 1; i < relations.length; i++) {
if (!_final[i]) {
if (dist[i] < min) {
min = dist[i];
vj = i;
}
}
}
_final[vj] = true;
for (int i = 1; i < relations.length; i++) {
if (!_final[i]) {
long tmp = (long)min + (long)relations[vj][i];//overflow avoidance
if (tmp < dist[i]) {
dist[i] = (int) tmp;
}
}
}
}
for (int i = 2; i < relations.length; i++) {
System.out.println("v" + i + " " + dist[i]);
}
return 0;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int[][] relations = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
relations[i][j] = Integer.MAX_VALUE;
}
}
for (int i = 0; i < m; i++) {
int start = scanner.nextInt();
int end = scanner.nextInt();
int weight = scanner.nextInt();
relations[start][end] = weight;
}
shortPath(1, relations);
scanner.close();
}
}