加权有向图

加权有向图

加权无向图中,边是没有方向的,并且同一条边会同时出现在该边的两个顶点的邻接表中,为了能够处理含有方向性的图的问题,我们需要实现以下加权有向图。

1. 加权有向图边的表示

API设计:

类名DirectedEdge
构造方法DirectedEdge(int v,int w,double weight):通过顶点v和w,以及权重weight值构造一个边对象
成员方法1.public double weight():获取边的权重值
2.public int from():获取有向边的起点
3.public int to():获取有向边的终点
成员变量1.private fifinal int v:起点
2.private fifinal int w:终点
3.private fifinal double weight:当前边的权重

代码:

/**
 * 加权有向图边表示
 */
public class DirectedEdge {
    // 起点
    private final int v;
    // 终点
    private final int w;
    // 当前边的权重
    private final double weight;

    // 通过顶点v和w,以及权重weight值构造一个边对象
    public DirectedEdge(int v, int w, double weight) {
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

    // 获取边的权重值
    public double weight() {
        return weight;
    }

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

    // 获取有向边的终点
    public int to() {
        return w;
    }
}

2. 加权有向图的实现

API设计:

类名EdgeWeightedDigraph
构造方法EdgeWeightedDigraph(int V):创建一个含有V个顶点的空加权有向图
成员方法1.public int V():获取图中顶点的数量
2.public int E():获取图中边的数量
3.public void addEdge(DirectedEdge e):向加权有向图中添加一条边e
4.public Queue adj(int v):获取由顶点v指出的所有的边
5.public Queue edges():获取加权有向图的所有边
成员变量1.private fifinal int V: 记录顶点数量
2.private int E: 记录边数量
3.private Queue[] adj: 邻接表

代码:

package cn.itcast.algorithm..有向图.加权有向图;

import cn.itcast.algorithm.线性表.Queue;

public class EdgeWeightedDigraph {
    // 顶点总数
    private final int V;
    // 边的总数
    private int E;
    // 邻接表
    private Queue<DirectedEdge>[] adj;

    // 创建一个含有V个顶点的空加权有向图
    public EdgeWeightedDigraph(int v) {
        // 初始化顶点总数
        this.V = v;
        // 初始换边数
        this.E = 0;
        // 初始化邻接表,以及其中的空队列
        this.adj = new Queue[V];
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new Queue<DirectedEdge>();
        }
    }

    // 获取图中顶点的数量
    public int V() {
        return V;
    }

    // 获取图中边的数量
    public int E() {
        return E;
    }

    // 向加权有向图中添加一条边e
    public void addEdge(DirectedEdge e) {
        // 获取有向边的起点
        int v = e.from();
        // 向v的邻接表中添加边
        adj[v].enqueue(e);
        // 边数+1
        E++;
    }

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

    // 获取加权有向图的所有边
    public Queue<DirectedEdge> edges() {
        // 创建一个队列,存储所有的边
        Queue<DirectedEdge> allEdge = new Queue<>();
        // 遍历顶点,拿到每个顶点的邻接表
        for (int v = 0; v < this.V; v++) {
            // 遍历邻接表,拿到邻接表中的每条边存储到队列中
            for (DirectedEdge e : adj[v]) {
                allEdge.enqueue(e);
            }
        }
        return allEdge;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农村小白i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值