思路:
首先使用数组存储,从起点开始找距离起点最近的点t,然后以t为中间点修正从起点到未访问各点的距离,以上操作执行n次。
代码:
package text2;
import java.util.*;
import java.io.*;
public class Dijkstra {
static int n,m;
static int g[][] = new int[10005][10005];//存放图
// static int dis[] = new int[n];//起点到每个点的最短距离
static int vis[] = new int[10005];//是否被标记过
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();//顶点数
m = scanner.nextInt();//边数
int s = scanner.nextInt();//图的起点
// Arrays.fill(dis, 0x3f3f3f3f);
for (int i = 0; i < n; i++) {
Arrays.fill(g[i], 0x3f3f3f3f);
g[i][i]=0;
}
Arrays.fill(vis, 0);
for(int i=0;i<m;i++) {
int v1=scanner.nextInt();
int v2=scanner.nextInt();
int weight=scanner.nextInt();
g[v1][v2]=weight;
g[v2][v1]= weight;
}
dijkstra(0);
System.out.print(g[0][2]);
}
//固定模板
public static void dijkstra(int s) {
for(int i=0;i<n;i++) {
int t=-1;
int min = 0x3f3f3f3f;
//找距离起点最近的一个点t(而且未被访问过)
for(int j=0;j<n;j++) {
if(vis[j]==0&&(t==-1||g[s][j]<min)) {
min = g[s][j];
t = j;
}
}
vis[t] = 1;
//以u为中间点,修正从【起点s】到未访问各点的距离
for(int j=0;j<n;j++) {
if(vis[j]==0) {
if(g[s][t]+g[t][j]<g[s][j]) {
g[s][j] = g[s][t]+g[t][j];
//此处还可以加路径
}
}
}
}
}
}