dijkstra算法

根据实际情况,overload一下构造方法即可。

package com.util;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

/**
 * dijkstra算法,求最短路径
 */
public class DijkstraUtil {

    private RoutePlanner planner = new RoutePlanner();
    private Graph g = new Graph();

    public DijkstraUtil() {
        List<Node> list = new ArrayList<Node>();
        Node aNode = new Node("A");
        list.add(aNode);
        // A -> B
        Edge aEdge1 = new Edge();
        aEdge1.setStartNodeID(aNode.getId());
        aEdge1.setEndNodeID("B");
        aEdge1.setWeight(10);
        aNode.getEdgeList().add(aEdge1);
        // A -> C
        Edge aEdge2 = new Edge();
        aEdge2.setStartNodeID(aNode.getId());
        aEdge2.setEndNodeID("C");
        aEdge2.setWeight(20);
        aNode.getEdgeList().add(aEdge2);
        // A -> E
        Edge aEdge3 = new Edge();
        aEdge3.setStartNodeID(aNode.getId());
        aEdge3.setEndNodeID("E");
        aEdge3.setWeight(30);
        aNode.getEdgeList().add(aEdge3);

        // ***************** B Node *******************
        Node bNode = new Node("B");
        list.add(bNode);
        // B -> C
        Edge bEdge1 = new Edge();
        bEdge1.setStartNodeID(bNode.getId());
        bEdge1.setEndNodeID("C");
        bEdge1.setWeight(5);
        bNode.getEdgeList().add(bEdge1);
        // B -> E
        Edge bEdge2 = new Edge();
        bEdge2.setStartNodeID(bNode.getId());
        bEdge2.setEndNodeID("E");
        bEdge2.setWeight(10);
        bNode.getEdgeList().add(bEdge2);

        // ***************** C Node *******************
        Node cNode = new Node("C");
        list.add(cNode);
        // C -> D
        Edge cEdge1 = new Edge();
        cEdge1.setStartNodeID(cNode.getId());
        cEdge1.setEndNodeID("D");
        cEdge1.setWeight(30);
        cNode.getEdgeList().add(cEdge1);

        // ***************** D Node *******************
        Node dNode = new Node("D");
        list.add(dNode);

        // ***************** E Node *******************
        Node eNode = new Node("E");
        list.add(eNode);
        // E -> D
        Edge eEdge1 = new Edge();
        eEdge1.setStartNodeID(eNode.getId());
        eEdge1.setEndNodeID("D");
        eEdge1.setWeight(20);
        eNode.getEdgeList().add(eEdge1);

        g.setM_nodeList(list);
    }

    public RoutePlanResult plan(String originID, String targetID) throws Exception {
        return planner.plan(g.getM_nodeList(), originID, targetID);
    }

    public PlanCourse plan(String originID) throws Exception {
        return planner.plan(g.getM_nodeList(), originID);
    }

    public class Edge {
        private String startNodeID;
        private String endNodeID;
        private double weight;

        public String getStartNodeID() {
            return startNodeID;
        }

        public void setStartNodeID(String startNodeID) {
            this.startNodeID = startNodeID;
        }

        public String getEndNodeID() {
            return endNodeID;
        }

        public void setEndNodeID(String endNodeID) {
            this.endNodeID = endNodeID;
        }

        public double getWeight() {
            return weight;
        }

        public void setWeight(double weight) {
            this.weight = weight;
        }

    }

    public class Node {
        private String id;
        private List<Edge> edgeList;

        public Node(String id) {
            this.id = id;
            this.edgeList = new ArrayList<Edge>();
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public List<Edge> getEdgeList() {
            return edgeList;
        }

        public void setEdgeList(List<Edge> edgeList) {
            this.edgeList = edgeList;
        }

    }

    public class Graph {
        private List<Node> m_nodeList = null;

        public List<Node> getM_nodeList() {
            return m_nodeList;
        }

        public void setM_nodeList(List<Node> m_nodeList) {
            this.m_nodeList = m_nodeList;
        }
    }

    class PassedPath {
        private String curNodeID;
        private boolean beProcessed;
        private double weight;
        private List<String> passedIDList;

        public PassedPath(String ID) {
            this.curNodeID = ID;
            this.weight = Double.MAX_VALUE;
            this.passedIDList = new ArrayList<String>();
            this.beProcessed = false;
        }

        public String getCurNodeID() {
            return curNodeID;
        }

        public void setCurNodeID(String curNodeID) {
            this.curNodeID = curNodeID;
        }

        public boolean isBeProcessed() {
            return beProcessed;
        }

        public void setBeProcessed(boolean beProcessed) {
            this.beProcessed = beProcessed;
        }

        public double getWeight() {
            return weight;
        }

        public void setWeight(double weight) {
            this.weight = weight;
        }

        public List<String> getPassedIDList() {
            return passedIDList;
        }

        public void setPassedIDList(List<String> passedIDList) {
            this.passedIDList = passedIDList;
        }

    }

    class PlanCourse {
        private Hashtable<String, PassedPath> htPassedPath;

        public PlanCourse(List<Node> nodeList, String originID) throws Exception {
            this.htPassedPath = new Hashtable<String, PassedPath>();
            Node originNode = null;
            for (Node node : nodeList) {
                if (originID.equals(node.getId())) {
                    originNode = node;
                } else {
                    PassedPath pPath = new PassedPath(node.getId());
                    this.htPassedPath.put(node.getId(), pPath);
                }
            }
            if (originNode == null) {
                throw new Exception("The origin node is not exist !");
            }
            this.InitializeWeight(originNode);
        }

        private void InitializeWeight(Node originNode) {
            if ((originNode.getEdgeList() == null) || (originNode.getEdgeList().size() == 0)) {
                return;
            }

            for (Edge edge : originNode.getEdgeList()) {
                PassedPath pPath = getPassedPath(edge.getEndNodeID());
                if (pPath == null) {
                    continue;
                }

                pPath.getPassedIDList().add(originNode.getId());
                pPath.setWeight(edge.getWeight());
            }
        }

        public PassedPath getPassedPath(String nodeID) {
            return this.htPassedPath.get(nodeID);
        }
    }

    class RoutePlanner {
        public RoutePlanResult plan(List<Node> nodeList, String originID, String destID) throws Exception {
            PlanCourse planCourse = plan(nodeList, originID);
            return this.getResult(planCourse, destID);
        }

        public PlanCourse plan(List<Node> nodeList, String originID) throws Exception {
            PlanCourse planCourse = new PlanCourse(nodeList, originID);
            Node curNode = this.getMinWeightRudeNode(planCourse, nodeList, originID);
            while (curNode != null) {
                PassedPath curPath = planCourse.getPassedPath(curNode.getId());
                for (Edge edge : curNode.getEdgeList()) {
                    PassedPath targetPath = planCourse.getPassedPath(edge.getEndNodeID());
                    double tempWeight = curPath.getWeight() + edge.getWeight();

                    if (tempWeight < targetPath.getWeight()) {
                        targetPath.setWeight(tempWeight);
                        targetPath.getPassedIDList().clear();

                        for (int i = 0; i < curPath.getPassedIDList().size(); i++) {
                            targetPath.getPassedIDList().add(curPath.getPassedIDList().get(i));
                        }

                        targetPath.getPassedIDList().add(curNode.getId());
                    }
                }
                planCourse.getPassedPath(curNode.getId()).setBeProcessed(true);
                curNode = this.getMinWeightRudeNode(planCourse, nodeList, originID);
            }
            return planCourse;
        }

        private RoutePlanResult getResult(PlanCourse planCourse, String destID) {
            PassedPath pPath = planCourse.getPassedPath(destID);

            if (pPath.getWeight() == Integer.MAX_VALUE) {
                RoutePlanResult result1 = new RoutePlanResult(null, Integer.MAX_VALUE);
                return result1;
            }

            String[] passedNodeIDs = new String[pPath.getPassedIDList().size()];
            for (int i = 0; i < passedNodeIDs.length; i++) {
                passedNodeIDs[i] = pPath.getPassedIDList().get(i);
            }
            RoutePlanResult result = new RoutePlanResult(passedNodeIDs, pPath.getWeight());

            return result;
        }

        private Node getMinWeightRudeNode(PlanCourse planCourse, List<Node> nodeList, String originID) {
            double weight = Double.MAX_VALUE;
            Node destNode = null;
            for (int i = 0; i < nodeList.size(); i++) {
                Node node = (Node) nodeList.get(i);
                if (originID.equals(node.getId())) {
                    continue;
                }

                PassedPath pPath = planCourse.getPassedPath(node.getId());
                if (pPath.isBeProcessed()) {
                    continue;
                }

                if (pPath.getWeight() < weight) {
                    weight = pPath.getWeight();
                    destNode = node;
                }
            }
            return destNode;
        }
    }

    public class RoutePlanResult {
        public RoutePlanResult(String[] passedNodes, double value) {
            m_resultNodes = passedNodes;
            m_value = value;
        }

        private String[] m_resultNodes;

        private double m_value;

        public String[] getM_resultNodes() {
            return m_resultNodes;
        }

        public void setM_resultNodes(String[] m_resultNodes) {
            this.m_resultNodes = m_resultNodes;
        }

        public double getM_value() {
            return m_value;
        }

        public void setM_value(double m_value) {
            this.m_value = m_value;
        }

        public String getStringResult() {
            String result;
            StringBuffer sb = new StringBuffer("[");
            for (int i = 0; i < m_resultNodes.length; i++)
                sb.append(m_resultNodes[i] + ",");
            if (sb.length() > 1)
                result = sb.substring(0, sb.length() - 1) + "]";
            else
                result = sb.append("]").toString();
            return result;
        }
    }
}

调用方法如下:

import com.util.DijkstraUtil;
import com.util.DijkstraUtil.RoutePlanResult;

/** 最短路径 **/
public class Test {

    public static void main(String[] args) throws Exception {
        DijkstraUtil du = new DijkstraUtil();
        RoutePlanResult result = du.plan("A", "D");
        System.out.println(result.getM_value());
        System.out.println(result.getStringResult());

    }
}
原文地址:https://www.cnblogs.com/sm21312/p/6374267.html