dijkstra算法,是计算单点到图中其他所有点的最短距离的一个算法。
类似与贪心法,dijkstra遍历n-1遍,每一遍都从剩余的没有确定的节点中找出一个距离源点最短距离的节点,直到n-1遍之后,节点处理完毕。
上面的图里,初始化除节点0外,其他节点到达0节点的距离都是直接距离,如1节点距离为100,2节点距离为30,3节点为无穷大,4节点为10。
第一遍遍历,找出(1,2,3,4)4个节点中距离节点0最短的节点4,距离为10,把节点4放入已确认节点,然后更新未确认节点中所有节点到达0节点最短距离,如节点3更新为60;
第二遍遍历,找出节点(1,2,3)中距离节点0最短的节点2,距离为30,放入已确认节点,更新未确认节点到达0节点的最短距离,如1节点更新为90;
第三遍遍历,找出节点(1,3)中距离节点0最短的节点3,距离为60,放入已确认节点;
第四遍遍历,1的距离90放入已确认节点。
代码:
/** * dijkstra: 查询图中从from节点到其他所有节点的最短距离 * * @param g * 图 * @param from * 起始节点 * @return int[] 返回类型 */ public static int[] dijkstra(Graph g, int from) { // 非法输入控制: if (g == null || g.num == 0 || from >= g.num) { return null; } int[] dist = new int[g.num]; for(int i = 0; i < g.num; i++){ dist[i] = INF; } boolean[] flag = new boolean[g.num]; // 初始化 Edge e = g.vexs.get(from).edge; while (e != null){ dist[e.iVex] = e.value; e = e.next; } flag[from] = true; dist[from] = 0; //通过n-1次循环,每次循环找出一个距离顶点最近的点 for(int i = 1; i < g.num; i++){ //最短距离 int min = MAX; //最短距离的点 int k = 0; for(int j = 0; j < g.num; j++){ if(dist[j] < min && !flag[j]){ k = j; min = dist[j]; } } //取得了最小值 flag[k] = true; //利用已得到的最短距离的点,更新dist集合 //取得节点k的边,然后根据边上的节点依次处理 Edge edge = g.vexs.get(k).edge; while(edge != null && min != MAX){ //k可达的节点 int temp = edge.iVex; if(dist[temp] == INF || dist[temp] >(min + edge.value)){ dist[temp] = min + edge.value; } edge = edge.next; } } return dist; }