【数据结构与算法】第十五、十六章:有向图、拓扑排序(检测环、顶点排序)

15、有向图

15.1、有向图的定义及相关术语

定义:有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点

  • 出度

    由某个顶点指出的边的个数称为该顶点的出度

  • 入度

    指向某个顶点的边的个数称为该顶点的入度

  • 有向路径

    由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点

  • 有向环

    一条至少含有一条边,且起点和终点相同的有向路径

在这里插入图片描述

一副有向图中两个顶点v和w可能存在以下四种关系:

  1. 没有边相连
  2. 存在从v到w的边 v—>w
  3. 存在从w到v的边 w—>v
  4. 既存在w到v的边,也存在v到w的边,即双向连接

在这里插入图片描述

理解有向图是一件比较简单的,但如果要通过眼睛看出复杂有向图中的路径就不是那么容易了

15.2、有向图API设计

在这里插入图片描述

在api中设计了一个反向图,因为有向图的实现中,用adj方法获取出来的是由当前顶点v指向的其他顶点,如果能得到其反向图,就可以很容易得到指向v的其他顶点

package chapter15;

import chapter03.Queue;

/**
 * @author 土味儿
 * Date 2021/9/15
 * @version 1.0
 * 有向图
 */
public class Digraph {
   
    /**
     * 顶点数量
     */
    private final int vNum;
    /**
     * 边数量
     */
    private int eNum;
    /**
     * 邻接表
     */
    private Queue<Integer>[] adj;

    /**
     * 构造器
     *
     * @param vNum
     */
    public Digraph(int vNum) {
   
        // 初始化顶点数量
        this.vNum = vNum;
        // 初始化边数量
        this.eNum = 0;
        // 初始化邻接表
        this.adj = new Queue[vNum];
        // 初始化邻接表中的空队列
        for (int i = 0; i < vNum; i++) {
   
            this.adj[i] = new Queue<Integer>();
        }
    }

    /**
     * 得到顶点数量
     *
     * @return
     */
    public int getVNum() {
   
        return vNum;
    }

    /**
     * 得到边数量
     *
     * @return
     */
    public int geteNum() {
   
        return eNum;
    }

    /**
     * 添加一条边v-w
     *
     * @param v
     * @param w
     */
    public void addEdge(int v, int w) {
   
        // 因为是有向图,w加入到v的链表中
        this.adj[v].enQueue(w);
        //this.adj[w].enQueue(v);
        // 边数量加1
        eNum++;
    }

    /**
     * 获取顶点v指出的边的所有顶点
     *
     * @param v
     * @return
     */
    public Queue<Integer> adj(int v) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

土味儿~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值