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



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值