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

概念

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

基本的数据结构

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

/**
 * 加权有向图
 * @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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值