1. 程式人生 > >Dijkstra演算法 java實現(含測試)

Dijkstra演算法 java實現(含測試)

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;
    }
}