思路:
首先使用数组存储,从起点开始找距离起点最近的点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]; //此处还可以加路径 } } } } } }