加权有向图的实现

一.概述

之前学习的加权无向图中,边是没有方向的,并且同一条边会同时出现在该边的两个顶点的邻接表中;而在加权有向图中,边只出现在起点的邻接表中!

二.实现

加权有向边:
在这里插入图片描述

//加权有向边
public class DirectedEdge implements Comparable<DirectedEdge> {
    private final int v;
    private final int w;
    private final double weight;

    public DirectedEdge(int v, int w, double weight) {
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

    public double weight() {
        return this.weight;
    }


    public int from(){ //返回有向边的起点
        return v;
    }

    public int to(){ //返回终点
        return w;
    }

    @Override
    public int compareTo(DirectedEdge o) {
        int r = 0;
        if (this.weight() > o.weight()) {
            r = 1;
        } else if (this.weight() < o.weight()) {
            r = -1;
        } else if (this.weight() == o.weight()) {
            r = 0;
        }
        return r;
    }
}

加权有向图:
在这里插入图片描述

//加权有向图
class EdgeWeightedDigragh{
    private final int V;
    private int E;
    private Queue<DirectedEdge>[] adj;
    //邻接表的索引表示顶点,索引的队列表示由该顶点指出的边!有向图中,该边只出现在起点的邻接表即可。

    public int V(){
        return V;
    }

    public int E(){
        return E;
    }

    //初始化一个含有v个顶点的空加权有向图
    public EdgeWeightedDigragh(int v) {
        this.V = v;
        this.E=0;
        this.adj=new LinkedList[v];
        for(int i=0;i<v;i++){
            adj[i]=new LinkedList<>();
        }
    }

    public void add(DirectedEdge e){
        //边e是有方向的!只需要让e出现在起点的邻接表!
        int v = e.from(); //获取起点v
        adj[v].add(e);  //添加至v的邻接表
        this.E++;
    }

    public Queue<DirectedEdge> adj(int v){ //获取顶点v指出的所有的边
        return adj[v];
    }

    public Queue<DirectedEdge> edges(){ //获取所有的边
        Queue<DirectedEdge> allEdges=new LinkedList<>();
        for(int i=0;i<this.V;i++){ //遍历每一个队列
            for(DirectedEdge k:adj[i]){  //将队列中每个DirectedEdge添加至edges队列
                allEdges.add(k);
            }
        }
        return allEdges;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值