【数据结构与算法】有向图设计实现

简介: 【数据结构与算法】有向图设计实现

前言


在实际生活中,很多应用相关的图都是有方向性的,最直观的就是网络,可以从A页面通过链接跳转到B页面,那么a和b连接的方向是a->b,但不能说是b->a,此时我们就需要使用有向图来解决这一类问题,它和我们之前学习的无向图,最大的区别就在于连接是具有方向的,在代码的处理上也会有很大的不同。


1671197683842.jpg


定义及相关术语


定义:

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

出度:

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

入度:

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

有向路径:

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

有向环:

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

1671197705806.jpg

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

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


API设计


类名 Digraph
成员变量 1.private final int V: 记录顶点数量2.private int E: 记录边数量3.private Queue[] adj: 邻接表
构造方法 Digraph(int V):创建一个包含V个顶点但不包含边的有向图
成员方法 1.public int V():获取图中顶点的数量2.public int E():获取图中边的数量3.public void addEdge(int v,int w):向有向图中添加一条边 v->w4.public Queue adj(int v):获取由v指出的边所连接的所有顶点5.private Digraph reverse():该图的反向图

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

能得到其反向图,就可以很容易得到指向v的其他顶点。


代码实现


/**
 * 有向图设计
 *
 * @author alvin
 * @date 2022/11/1
 * @since 1.0
 **/
public class Digraph {
    //顶点数目
    private final int V;
    //边的数目
    private int E;
    //邻接表
    private Queue<Integer>[] adj;
    public Digraph(int V){
        //初始化顶点数量
        this.V = V;
        //初始化边的数量
        this.E = 0;
        //初始化邻接表
        this.adj = new Queue[V];
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new ArrayDeque<>();
        }
    }
    //获取顶点数目
    public int V(){
        return V;
    }
    //获取边的数目
    public int E(){
        return E;
    }
    //向有向图中添加一条边 v->w
    public void addEdge(int v, int w) {
        //只需要让顶点w出现在顶点v的邻接表中,因为边是有方向的,最终,顶点v的邻接表中存储的相邻顶点的含义是:  v->其他顶点
        adj[v].add(w);
        E++;
    }
    //获取由v指出的边所连接的所有顶点
    public Queue<Integer> adj(int v){
        return adj[v];
    }
    //该图的反向图
    private Digraph reverse(){
        //创建有向图对象
        Digraph r = new Digraph(V);
        for (int v = 0;v<V;v++){
            //获取由该顶点v指出的所有边
            for (Integer w : adj[v]) {//原图中表示的是由顶点v->w的边
                r.addEdge(w,v);//w->v
            }
        }
        return r;
    }
}


目录
相关文章
|
8月前
|
存储 算法 C++
【C/C++ 数据结构 】无向图和有向图的差异
【C/C++ 数据结构 】无向图和有向图的差异
271 0
|
机器学习/深度学习 数据建模 定位技术
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
3498 0
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
|
2月前
|
JSON 算法 数据挖掘
基于图论算法有向图PageRank与无向图Louvain算法构建指令的方式方法 用于支撑qwen agent中的统计相关组件
利用图序列进行数据解读,主要包括节点序列分析、边序列分析以及结合节点和边序列的综合分析。节点序列分析涉及节点度分析(如入度、出度、度中心性)、节点属性分析(如品牌、价格等属性的分布与聚类)、节点标签分析(如不同标签的分布及标签间的关联)。边序列分析则关注边的权重分析(如关联强度)、边的类型分析(如管理、协作等关系)及路径分析(如最短路径计算)。结合节点和边序列的分析,如子图挖掘和图的动态分析,可以帮助深入理解图的结构和功能。例如,通过子图挖掘可以发现具有特定结构的子图,而图的动态分析则能揭示图随时间的变化趋势。这些分析方法结合使用,能够从多个角度全面解读图谱数据,为决策提供有力支持。
110 0
|
4月前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
209 8
|
机器学习/深度学习 算法 测试技术
C++算法:有向图计数优化版原理及实现
C++算法:有向图计数优化版原理及实现
|
算法 测试技术 C++
C++算法:有向图访问计数的原理及实现
C++算法:有向图访问计数的原理及实现
|
安全 算法 Go
有向图的强联通分量(SCC)Tarjan算法
有向图的强联通分量(SCC)Tarjan算法
207 0
|
存储 算法 Java
【数据结构与算法】有向图的拓扑排序
【数据结构与算法】有向图的拓扑排序
223 1
【数据结构与算法】有向图的拓扑排序
|
C++
数据结构创建有向图(C++语言)
数据结构创建有向图(C++语言)
118 0
|
算法
哈密顿路径在图G中找出一条包含所有顶点的简单路径,该路径称为哈密顿路径(1)图G是非完全有向图,且图G不一定存在哈密顿路径; > (2)设计算法判断图G是否存在哈密顿路径,如果存在,输出一天哈密顿路径
哈密顿路径在图G中找出一条包含所有顶点的简单路径,该路径称为哈密顿路径(1)图G是非完全有向图,且图G不一定存在哈密顿路径; > (2)设计算法判断图G是否存在哈密顿路径,如果存在,输出一天哈密顿路径
159 0