最短路径的概念与基本数据结构

来源:互联网 发布:拓普康全站仪导出数据 编辑:程序博客网 时间:2024/06/06 17:30

概念

最短路径最直接的例子就是导航软件的,从一个地方到另一个地方的路径。要实现最短路径算法,一般使用一个加权有向图。即找到一个顶点到另一个顶点权重最小的有向路径。

基本的数据结构

带权有向图的数据结构和带权无向图差不多,只是添加边的时候不添加一条双向的边。

/** * 加权有向图 * @author yuli * */public class EdgeWeightedDiGraph {    private final int v;//顶点数    private int e;//边数    private List<Edge>[] adj;//邻接表    @SuppressWarnings("unchecked")    public EdgeWeightedDiGraph(int v,int e) {        this.v = v;        adj = new LinkedList[v];        for(int i=0;i<v;i++){            adj[i] = new LinkedList<Edge>();        }    }    @SuppressWarnings("unchecked")    public EdgeWeightedDiGraph(File file) throws IOException{        FileReader fr = new FileReader(file);        BufferedReader br = new BufferedReader(fr);        int vertex = Integer.parseInt(br.readLine());//读取顶点数        this.v = vertex;//读取顶点数        //创建有顶点数的邻接表        adj = new LinkedList[vertex];        for(int i=0;i<vertex;i++){            adj[i] = new LinkedList<>();        }        int edge = Integer.parseInt(br.readLine());//读取边        for(int i=0;i<edge;i++){            //获取顶点对            String[] vertexs = br.readLine().split(" ");            int v = Integer.parseInt(vertexs[0]);            int m = Integer.parseInt(vertexs[1]);            double weight = Double.parseDouble(vertexs[2]);            //生成加权边            Edge e = new Edge(v, m, weight);            //将顶点对添加成一条边            addEdge(e);        }        if(br!= null){            br.close();        }    }    /**     * 获取边数     * @return     */    public int getE() {        return e;    }    /**     * 获取顶点数     * @return     */    public int getV() {        return v;    }    /**     * 添加一条有向边      * @param v     * @param m     * @param e     */    private void addEdge(Edge e){        adj[e.getV()].add(e);        this.e++;    }    /**     * 获取邻接点     * @param v     * @return     */    public Iterable<Edge> adj(int v){        return adj[v];    }    /**     * 获取所有边     * @return     */    public Iterable<Edge> edges(){        List<Edge> edges = new ArrayList<>();        for (List<Edge> list : adj) {            edges.addAll(list);        }        return edges;    }}
原创粉丝点击