Dijkstra演算法 java實現(含測試)
阿新 • • 發佈:2019-01-03
D演算法的實現(求任意點到其他點的最短距離):
package D; import java.util.ArrayList; import java.util.List; /** * @author sean22 * @date 2017/12/13/013. * 通過Dijkstra演算法找出距離各點離matrix[0]最近的距離. * 實現步驟: * 初始化節點組: * 目標本身的距離為0,其他節點到目標的距離為目標列每行的值。不相鄰為X * 迴圈節點組.length-1次 * 1.找出離目標a最近的點b.(除標記外) * 2.判斷b的相鄰結點c,MIN(c->b->a,c->a) * 3.標記b. */ public class Dijkstra { static int X = Integer.MAX_VALUE; public static void main(String[] args) { int[][] matrix = { {X,X,X,3,4,X}, {X,X,2,X,5,X}, {X,2,X,X,X,4}, {3,X,X,X,X,2}, {4,5,X,X,X,3}, {X,X,4,2,3,X} }; int root = 0; List<Node> nodes = initNodes(matrix,root); for(int i=2;i<nodes.size();i++){ //找到離目標最近的節點 Node nearest = getNearestNode(nodes); updateNeighbors(nearest,nodes); nearest.mark(); } print(nodes,root); } public static List<Node> initNodes(int[][] matrix,int root){ List<Node> list =new ArrayList<>(); for(int i=0;i<matrix.length;i++) { Node node = new Node(); if(i==root){ node.distance =0; node.mark(); }else { node.neighbor = matrix[i]; node.distance = matrix[i][root]; } list.add(node); } return list; } public static Node getNearestNode(List<Node> nodes){ Node nearest =null; int i=0; for(;i<nodes.size();i++){ if(!nodes.get(i).isMarked) { nearest = nodes.get(i); break; } } for(;i<nodes.size();i++){ if(nodes.get(i).isMarked) { continue; } if(nodes.get(i).distance<nearest.distance) { nearest = nodes.get(i); } } return nearest; } public static void updateNeighbors(Node nearest,List<Node> nodes){ int[] neighbors = nearest.neighbor; for(int i=0;i<neighbors.length;i++){ if(!nodes.get(i).isMarked&&neighbors[i]!=X){ checkAndUpdate(nodes.get(i),nearest.distance+neighbors[i]); } } } public static void checkAndUpdate(Node neighbor,int sum){ neighbor.distance =sum>neighbor.distance?neighbor.distance:sum; } public static void print(List<Node> nodes,int root){ System.out.println("最短距離:"); for(int i=0;i<nodes.size();i++){ System.out.println(i+"<->"+root+"="+nodes.get(i).distance); } } }
Node類:
package D;
/**
* @author sean22
* @date 2017/12/13/013.
*/
public class Node {
public int distance;
public int[] neighbor;
public boolean isMarked =false;
public void mark(){
isMarked = true;
}
}