Dijkstra算法 :
时间复杂度O(n*n),空间复杂度O(n*n)。解决单源节点最短路径问题,OSPF动态路由协议应用。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 贪婪算法 * */ public class Dijkstra { private static final int ENDLESS = Integer.MAX_VALUE/2; public static int[] dijkstra(int data[][],int vertex){ int result[] = new int[data.length]; for (int i = 1; i < data.length; i++) { result[i] = data[vertex][i]; } //初始化S集合 List<Integer> u = new ArrayList<Integer>(); for (int i = 1; i < data.length; i++) { u.add(i); } u.remove(new Integer(vertex)); //初始化U集合 List<Integer> s = new ArrayList<Integer>(); s.add(vertex); while (!u.isEmpty()) { int min = ENDLESS; int minVertex = -1; //找到U集合中距离【起始点】最近的点,然后将该点从U集合中remove for (Iterator<Integer> iterator = u.iterator(); iterator.hasNext();) { Integer integer = (Integer) iterator.next(); if (result[integer] <= min) { minVertex = integer; min = result[integer]; } } u.remove(new Integer(minVertex)); //更新最短路径 for (Iterator<Integer> iterator = u.iterator(); iterator.hasNext();) { Integer integer = (Integer) iterator.next(); if (result[minVertex] + data[minVertex][integer] < result[integer]) { result[integer] = result[minVertex] + data[minVertex][integer]; } } } return result; } public static void main(String[] args) { int data[][] = { {ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS}, {ENDLESS,0,2,ENDLESS,1,ENDLESS,ENDLESS,ENDLESS}, {ENDLESS,ENDLESS,0,ENDLESS,3,10,ENDLESS,ENDLESS}, {ENDLESS,4,ENDLESS,0,ENDLESS,ENDLESS,5,ENDLESS}, {ENDLESS,ENDLESS,ENDLESS,2,0,2,8,4}, {ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS,0,ENDLESS,6}, {ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS,0,ENDLESS}, {ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS,ENDLESS,1,0}, }; int result[] = dijkstra(data, 1); for (int i = 1; i < result.length; i++) { System.out.println(result[i]); } } }
运行结果为:
0
2
3
1
3
6
5