算法与数据结构(24)—— 邻接表表示稀疏图

本文深入探讨图数据结构的基础概念,包括无向图、有向图、无权图、有权图及简单图等类型,并介绍了图的两种主要表示方法:邻接矩阵与邻接表。通过一个Java实现的SparseGraph类,详细解释了如何使用邻接表来表示图,并提供了添加边、获取顶点数量等基本操作的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用:交通运输,社交网络,互联网,工作安排,脑区活动

图的分类:

  • 无向图和有向图(无向图是一种特殊的有向图)
  • 无权图和有权图

简单图不包括自环边和平行边。

  • 自环边:自己指向自己
  • 平行边:两个点有多条边

图的表示: 

  • 邻接矩阵:适用稠缪图(Dense Graph,每个点几乎与每个点相连,即完全图)
  • 邻接表:适用稀疏图(Sparse Graph)
public class SparseGraph {

    private int n;  
    private int m;  
    private boolean directed;    
    private List<Integer>[] g; 

    public SparseGraph(int n, boolean directed) {
        assert n >= 0;
        this.n = n;
        this.m = 0;   // 初始化没有任何边
        this.directed = directed;
        g = (ArrayList<Integer>[]) new ArrayList[n];
        for (int i = 0; i < n; i++) {
            g[i] = new ArrayList<Integer>();
        }
    }

    public int V(){ return n; }    
    public int E(){ return m; }    

    // 向图中添加一个边
    public void addEdge(int v, int w){

        assert v >= 0 && v < n ;
        assert w >= 0 && w < n ;

        g[v].add(w);
        if( v != w && !directed )  //判断了自环边和有向边
            g[w].add(v);

        m ++;
    }

    // 复杂度最差为O(n),一般不用这个~
    public boolean hasEdge(int v, int w){

        assert v >= 0 && v < n;
        assert w >= 0 && w < n;

        for(int i = 0; i < g[v].size(); i ++){
            if(g[v].get(i) == w)
                return true;
        }
        return false;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值