基础算法--有向图 以及有向图图的一些环检测、拓扑排序、可达性检测基础 java描述

基础算法–有向图 以及有向图图的一些环检测、拓扑排序、可达性检测基础 java描述


前言

提示:这是一篇《算法第四版》的读后笔记,不会提供main测试,当中案例主要导入随书资料的自定义的类库

提示:以下是本篇文章正文内容,下面案例可供参考

一、有向图的数据类型

当中的addEdge方法其实和无向图类似,只变为了单向表示。这里主要使用的室邻接矩阵来表示图,表示方法有以下说明
1、对于邻接矩阵,我们将使用V*V的布尔数组表示顶点,如果有v和w的顶点,v-w相连接,那么adj[v][w]与adj[w][v]为true。但是需要留意,如果数据是上百万的顶点,那么V*V的空间大小是不能满足的。
2、庞大数据我们可以考虑邻接表,如下图,bag对象也可以用set代替,c++代码可以使用vector
在这里插入图片述

提示:这里对文章进行总结:
建图代码如下,其核心在于,要怎么表示邻接表的数据结构,我们创建adj的bag对象数组作为邻接表,其索引是顶点表示,bag对象中将会存储索引中所有相邻的顶点。在addEdge中,我们会添加v-w这是有向图的表示方法,在建图完成之后,就可以进行一些无向图的基本操

/*
* @param  V 这是图中的边数
*/
public class Digraph{
    
    private final int V;			//顶点数
    private int E;					//边数表示
    private Bag<Integer>[] adj;		//邻接表顶点的相邻顶点,这个可以用其它可变长度数组替代,c++可以使用vector,
    
    /* 构造函数中,主要目的是初始化“邻接表”, */
    public Digraph(int V){
    
        this.V = V;
        this.E = 0;						//一开始我们的边是没有链接的(初始化阶段)
        adj = (Bag<Integer>[])new Bag[V];	//接下来就是创建邻接表
        
        for(int v = 0;v < V;v++){
    
            adj[v] = new Bag<Integer>();
        }
    }
    /* 以下两个是辅助方法,客户代码中,有时候会希望获取到边数和定点数 */
    public int getV(){
    
        return V;
    }
    
    public int gerE(){
    
        return E;
    }
    
    /*
    * 相比无向图少了一个adj[w].add(v),
    * 
    * param V与w这是两个将要链接的顶点
    */
    public void addEdage(int v,int w){
    
        adj[v].add(w);
        E++;
    }
    
    /*
    * 有时我们会希望能够使用迭代,比如范围for循环中使用。
    * 
    * param v 顶点
    * return v顶点所有相邻顶点
    */
    public Iterable<Integer>adj(int v){
    
        return adj[v]          
    }
    
    /*
    * 在处理有向图会比较有用,后续的例子会看到
    * 
    * return 返回一个有向图副本,但是这是相对于原图的翻转结果
    */
    public  Digraph reverse(){
    
        Digraph R =  new Digraph(V);
        
        
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值