您的位置:首页 > 编程语言 > Java开发

Dijkstra算法 java实现(含测试)

2018-01-19 20:45 197 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Dijkstra java 最短路径