有向图的几个算法分析总结

本文详细介绍了有向图的定义、数据结构实现,并着重分析了环的存在与检测、深度优先遍历排序以及拓扑排序。在环检测中,通过深度优先搜索,利用onStack数组记录节点状态,避免误判环。拓扑排序则可通过深度优先遍历的后序序列反转得到。文章最后提出另一种思路,通过入度为0的节点开始遍历以简化拓扑排序的实现。
摘要由CSDN通过智能技术生成

有向图的几个算法分析总结

无向图的一个特性就是其中一旦两个节点a和b是相连的,这就意味着有路径从a到b,同时也有从b到a的。它具体对应的矩阵表达方式对应着一个对称矩阵。而这里重点是考察有向图。和无向图比起来,有向图更加多了一种出入度的概念。因为方向的有向性,很多以前在无向图里看起来比较简单的问题在这里会变得更加有意思。


有向图定义


一个常用的有向图会如下图这样:



因为每个节点和节点之间对应着一定的方向关系,所以这里用一个箭头来表示从一个节点到另外一个节点的有向关系。在具体保存有向图定义的数据结构里,我们还是可以采用一样的链表组结构。只是因为是有向图,所以加入元素的时候不用考虑对称节点的问题。在实现上其实也更加简化。


下面是一个关于有向图的简单定义实现:


public class Digraph {  

    private final int vertices;  

    private int edges;  

    private List<LinkedList<Integer>> adj;  

  

    public Digraph(int vertices) {  

        if(vertices < 0throw new IllegalArgumentException(  

                "Number of vertices in a Digraph must be nonnegative");  

        this.vertices = vertices;  

        this.edges = 0;  

        adj = new ArrayList<LinkedList<Integer>>();  

        for(int i = 0; i < vertices; i++) {  

            adj.add(new LinkedList<Integer>());  

        }  

    }  

  

    public void addEdge(int v, int w) {  

        if(v < 0 || v >= vertices)   

            throw new IndexOutOfBoundsException(  

                    "vertex " + v + " not in bound.");  

        if(w < 0 || w >= vertices)   

            throw new IndexOutOfBoundsException(  

                    "vertex " + w + 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Usher_Ou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值