无权最短路径

问题的描述是这样的:有一个有向无权图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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值