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