Dijkstra算法 java实现(含测试)
2018-01-19 20:45
197 查看
D算法的实现(求任意点到其他点的最短距离):
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;
}
}
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程序——6 STDijkstraAdv类
- 一个用Dijkstra算法实现的路由算法的java程序——8 GraphMain类
- Jsp/Java代码分离.实现页面真正的代码分离 测试代码是否按想法运行,下载原代码
- java动态代理类,测试,实现AOP,在执行target回调方法前后插入相关代码处理
- Java实现MD5加密以及解密类,附带测试类,具体见代码。
- 单源点最短路径Dijkstra算法的JAVA实现
- 一个用Dijkstra算法实现的路由算法的java程序——3 STDijkstra类
- 【软件测试】使用JUnit框架实现Java单元测试
- JAVA + LR实现apache流媒体的性能测试(JAVA部分)
- 性能测试数据生成——java代码实现
- 基于地图的深度优先、广度优先、Dijkstra算法Java实现。
- 一年前用java写的一个公交换乘算法测试,实现一次换乘
- java版本的expect: 简单方式实现ssh/telnet与服务器端的交互和自动化测试
- 用Java实现的简单人品测试程序
- 单源点最短路径Dijkstra算法的JAVA实现
- JAVA + LR实现apache流媒体的性能测试(LR部分)
- 一个用Dijkstra算法实现的路由算法的java程序——7 GraphShowAdv类
- 最短路径Dijkstra算法的JAVA实现--转载
- 一个用Dijkstra算法实现的路由算法的java程序——5 GraphShow类
- 在JAVA中实现图形界面退出(已测试)