Dijkstra算法模板:
//dijk模板
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static final int N = 10010;
static int n, m;
static int[][] g = new int[501][501];//本模板使用邻接矩阵,不适宜处理稀疏图,空间可能会爆
static int[] dist = new int[N];
static boolean[] st = new boolean[501];
static int dijk() {
Arrays.fill(dist, 0x3f3f3f3f);
dist[1] = 0;
for (int i = 0; i < n; i++) {
int t = -1;
for (int j = 1; j <= n; j++) { //遍历所有点,找到集合外的最小的点
if (!st[j] && (t == -1 || dist[t] > dist[j])) { //if(集合外&&(还未选点||可选更小的点))
t = j;
}
}
st[t] = true;//加入集合
for (int j = 1; j <= n; j++) { //用刚才加入集合的点的距离更新所有点的距离
dist[j] = Math.min(dist[j], dist[t] + g[t][j]);//min(1到j的距离,1到t的距离+t到j的距离)
}
}
return dist[n] == 0x3f3f3f3f ? -1 : dist[n];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
for (int i = 1; i <= n; i++) {
Arrays.fill(g[i], 0x3f3f3f3f);
}
while (m-- > 0) {
int x = sc.nextInt();
int y = sc.nextInt();
int z = sc.nextInt();
g[x][y] = Math.min(g[x][y], z);//处理重边,自然是保留边权最小的
}
System.out.println(dijk());
}
}
Dijkstra 算法的模板实现,用于在加权图中求解单源最短路径问题。下面是代码的详细解释:
N = 10010
: 定义了一个常量N
,表示顶点的最大数量。n, m
: 分别表示图中的顶点数和边数。g[][]
: 邻接矩阵表示的图,其中g[i][j]
表示顶点i
到顶点j
的边权,初始时全部初始化为一个较大的数(这里用0x3f3f3f3f
表示)。dist[]
: 数组表示从起点到每个顶点的最短距离。st[]
: 数组表示每个顶点是否已经加入集合中,初始时全部为false
。
然后是 dijk()
方法:
- 首先将所有顶点到起点的距离初始化为无穷大,起点到自己的距离初始化为 0。
- 然后进行
n
次循环,每次选择一个未加入集合的顶点加入集合中,并更新集合外的顶点到集合的距离。 - 在每次循环中,首先找到集合外的距离起点最近的顶点
t
。 - 将顶点
t
标记为已加入集合。 - 然后遍历所有顶点
j
,更新顶点j
到起点的最短距离:dist[j] = Math.min(dist[j], dist[t] + g[t][j])
。 - 最后返回终点到起点的最短距离,如果终点到起点的最短距离仍然是初始值,则说明无法到达终点,返回 -1。
main()
方法用于读取输入并调用 dijk()
方法求解最短路径问题。