代码
import java.util.Scanner;
public class Dijkstra {
public static int[][] e;
public static int[] dis;
public static int INF = 99999;
public static int M = 0;
public static int N = 0;
public static int v1, v2;
public static int v3, v4;
public static int weight = INF;
public static int[] book;
public static int target;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
M = sc.nextInt();
N = sc.nextInt();
v3 = sc.nextInt();
v4 = sc.nextInt();
init();
for (int i = 0; i < N; i++) {
v1 = sc.nextInt();
v2 = sc.nextInt();
weight = sc.nextInt();
e[v1][v2] = weight;
}
dijkstra();
System.out.println("顶点" + v3 + "到顶点" + v4 + "之间的最短路径为:" + dis[v4]);
for (int i = 0; i < M; i++) {
System.out.print(dis[i] + " ");
}
}
}
public static void dijkstra() {
initDis();
for (int i = 0; i < M; i++) {
int min = Integer.MAX_VALUE;
for (int j = 0; j < M; j++) {
if (book[j] == 0 && dis[j] < min && j != v3) {
min = dis[j];
target = j;
}
}
book[target] = 1;
for (int j = 0; j < M; j++) {
if (dis[j] > dis[target] + e[target][j]) {
dis[j] = dis[target] + e[target][j];
}
}
}
}
public static void initDis() {
for (int i = 0; i < M; i++) {
if (i == v3) {
dis[v3] = 0;
book[v3] = 1;
} else {
dis[i] = e[v3][i];
}
}
}
public static void init() {
e = new int [M][M];
dis = new int[M];
book = new int[M];
for (int i = 0; i < M; i++) {
for (int j = 0;j < M; j++) {
if (i == j) {
e[i][j] = 0;
} else {
e[i][j] = INF;
}
}
}
}
}
几点注意
- 根据稀疏度可以从存储结构上优化
- 时间复杂度O(N^2)
- 不能求解负带权边的图