无权最短路径

来源:互联网 发布:python输出语句格式 编辑:程序博客网 时间:2024/05/09 14:25

问题的描述是这样的:有一个有向无权图G,指定一个特定的顶点s作为起点,要求找出从s出发到G中的每一个其它顶点的最短路径。

package com.gloomy.graph;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.List;import java.util.Queue;/** * 无权最短路径 *  * @author 过路的守望 * */public class UnweightPathLength {    public static void main(String[] args) {        Vertex A = new Vertex("A");        Vertex B = new Vertex("B");        Vertex C = new Vertex("C");        Vertex D = new Vertex("D");        Vertex E = new Vertex("E");        Vertex F = new Vertex("F");        Vertex G = new Vertex("G");        A.getAdjacentList().add(B);        A.getAdjacentList().add(D);        B.getAdjacentList().add(D);        B.getAdjacentList().add(E);        C.getAdjacentList().add(A);        C.getAdjacentList().add(F);         D.getAdjacentList().add(C);        D.getAdjacentList().add(E);        D.getAdjacentList().add(F);        D.getAdjacentList().add(G);        E.getAdjacentList().add(G);        G.getAdjacentList().add(F);        UnweightPathLength unweightPathLength = new UnweightPathLength();        unweightPathLength.unweightedPath(C);    }    /**     * 无权最短路径-广度优先遍历     * 时间复杂度O(E+V)     * @param s     */    public void unweightedPath(Vertex s) {        if (s == null) {            return;        }        Queue<Vertex> queue = new ArrayDeque<Vertex>();        /*         * 选择s为起点         */        s.setDist(0);        queue.offer(s);        Vertex curVertex = s;        while (!queue.isEmpty()) {            curVertex = queue.poll();            for (Vertex vertex : curVertex.getAdjacentList()) {                if (vertex.getDist() == Integer.MAX_VALUE) {                    //更新路径长度                    vertex.setDist(curVertex.getDist() + 1);                    vertex.setPreVertex(curVertex);                    queue.offer(vertex);                }            }        }        while (curVertex != null) {            System.out.print(curVertex.getLabel() + "-->");            curVertex = curVertex.getPreVertex();        }    }}class Vertex {    /*     * 路径距离     */    private int dist = Integer.MAX_VALUE;    /*     * 前继顶点     */    private Vertex preVertex;    /*     * 邻接表     */    private List<Vertex> adjacentList;    /*     * 标签     */    private String label;    public Vertex(String label) {        super();        this.adjacentList = new ArrayList<Vertex>();        this.label = label;    }    public List<Vertex> getAdjacentList() {        return adjacentList;    }    public int getDist() {        return dist;    }    public String getLabel() {        return label;    }    public Vertex getPreVertex() {        return preVertex;    }    public void setAdjacentList(List<Vertex> adjacentList) {        this.adjacentList = adjacentList;    }    public void setDist(int dist) {        this.dist = dist;    }    public void setLabel(String label) {        this.label = label;    }    public void setPreVertex(Vertex preVertex) {        this.preVertex = preVertex;    }}
0 0
原创粉丝点击