---恢复内容开始---
Dijkstra算法主要是用来找出图中一点到另一点的最短路径。思路是,从出发点开始,更新出发点的邻接点距离(从初始的无穷大更新为出发点到邻节点边的权重),找出距离最小的顶点,更新该顶点的邻接点到出发点的距离,完毕之后再找出未被访问过的刀出发点距离最短的顶点,进行之前的操作。这样,当所以顶点都被访问过之后,储存距离的数组中储存的就是出发点到各顶点的最小距离了。看下面这个例子:
如果要找出0到4的最短距离,一下子找出来还是比较困难的,这时用Dijkstra算法就很方便了。
class test { public static void main(String[] args) { int M=10000; int[][] graph = { {0,10,M,30,100}, {M,0,50,M,M}, {M,M,0,M,10}, {M,M,20,0,60}, {M,M,M,M,0} }; int start=0; dijkstra(graph,0); } public static void dijkstra(int[][] arr,int start) { int num=arr.length;//顶点个数 boolean[] visited=new boolean[num];//标记顶点是否最终处理 int[] dist=new int[num];//出发点到顶点的当前最短距离 //初始化 for (int i=0;i<num ;i++ ) { visited[i]=false; dist[i]=10000; } //预处理出发点 dist[start]=0; visited[start]=true; //预处理出发点,更新出发点的邻接点的距离 for (int i=0;i<num ;i++ ) { if (arr[start][i]<dist[i]&&visited[i]==false) dist[i]=arr[start][i]; } //开始循环 while (true) { //当没有未标记的点时跳出循环 int min=10000; int index=10000; for (int i=0;i<dist.length ; i++) { if (dist[i]<min&&visited[i]==false) { min=dist[i]; index=i; } } //int index=findmin(dist); if (index==10000) { break; } visited[index]=true; for (int i=0;i<num ; i++) { if (visited[i]==false&&arr[index][i]<10000) { if (dist[i]>dist[index]+arr[index][i]) dist[i]=dist[index]+arr[index][i]; } } } for (int i=0;i<num ;i++ ) { System.out.println("从"+start+"到"+i+"的最短距离是"+dist[i]); } } }
打印结果