算法的核心思想:”最短路径的任一段子路径都是最短路径“ 实例: 用数组表示: 迭代: 代码一定要配合表格看,java格式 //以下说明必看: //a[i][j]表示边(i,j)的权。dist[i]表示从源到顶点i的最短特殊路径长度 //prev[i]:到i点最短路径的前一个点到源点的最短距离 public class TheShortestWay { static int MAX_SIZE=6; public static void dijkstra(int v,float[][]a,float[]dist,int[]prev) //参数分别为v:每一个出发的顶点,a数组为每一条有向边的权值, //a[i][j]表示边(i,j)的权。dist[i]表示从源到顶点i的最短特殊路径长度 //prev[i]:到i点最短路径的前一个点到源点的最短距离 { int n=dist.length-1; //n为除去源节点后的节点个数 if(v<1||v>n)return; boolean []s=new boolean[n+1]; //初始阶段 for(int i=1;i<=n;i++) { dist[i]=a[v][i]; //距离等于顶点和节点i的直连权值 s[i]=false; //s[i]为false表示节点源节点到i节点的最短距离还没找到 if(dist[i]==Float.MAX_VALUE) //如果距离等于无穷大, prev[i]=0; else // 如果不是,那么上一个节点就是v(即源节点) prev[i]=v; } //源节点的距离为0, dist[v]=0;s[v]=true; for(int i=1;i<n;i++)//这个for循环控制着整个过程 { float temp=Float.MAX_VALUE; //定义temp为无穷大 int u=v; for(int j=1;j<=n;j++) if((!s[j])&&(dist[j]<temp)) { u=j; temp=dist[j]; //temp就是此次搜寻的最小值 } s[u]=true; //代表节点u已经找到到源节点的最短路径了 for(int j=1;j<=n;j++) //对于每一个节点(源节点除外) if((!s[j])&&(a[u][j]<Float.MAX_VALUE)) //只要到这个节点的距离不是无穷大&还没有找到最小值 { float newdist=dist[u]+a[u][j]; //新的距离=原来的距离+新的权值 //如果新的距离小于原来的距离,那么距离换成新的距离 if(newdist<dist[j]) { dist[j]=newdist; prev[j]=u; } } } } public static void main(String args[]) { float a[][]=new float[MAX_SIZE][MAX_SIZE]; float[]dist=new float[MAX_SIZE]; int []prev=new int[MAX_SIZE]; for(int i=0;i<6;i++) for(int j=0;j<6;j++) a[i][j]=Float.MAX_VALUE; //首先把所有的都定义为无穷大 a[1][2]=10; a[1][4]=30; a[1][5]=100; a[2][3]=50; a[3][5]=10; a[4][3]=20; a[4][5]=60; int v=1;//假设从顶点1处出发 dijkstra(v,a,dist,prev);//输入是v和a,输出是dist和prev数组 System.out.println("从1出发到2、3、4、5的最短路径依次是:"); for(int j=2;j<6;j++) { System.out.println(dist[j]); } int z=prev[5],y=prev[z],x=prev[y]; System.out.println("从1到5最短路径经过的点为:"); System.out.print(x+" "+y+" "+z+" "+"5"); } } 详尽分析见 网盘-》算法