图的存储方式以及邻接表数组的实现

一、图的存储方式

邻接矩阵和邻接表是存储图的两种不同方式,一般邻接矩阵用于稠密图的存储,而邻接表用于稀疏图的存储

假设一个图有n的顶点,m条边:
1、当n*n 远大于 m时,就称为稀疏图,采用邻接表可以节省空间,也可以降低时间复杂度
2、当n*n 与 m较为接近时,就可以采用邻接矩阵
邻接表是完全可以代替邻接矩阵

二、实现邻接表

一般邻接表都是使用指针链表来实现的,但是在实际应用中较为麻烦,所以采用数组来实现邻接表,这种方法为每个顶点i(i从1~n)都设置了一个链表,里面保存了从顶点i出发的所有的边

实现方法:
1、需要对每条边进行1~m的编号
2、用u[]、v[]、w[]三个数组来记录每条边的信息,即u[i]、v[i]、w[i]表示第i条边是从第u[i]号顶点到v[i]顶点(u[i] -> v[i]),且权值为w[i]
3、first[]数组的1~~n号单元格分别用来存储1~n号顶点的第一条边的编号,下标表示边的起始顶点即first[u[i]]保存顶点u[i]的第一条边的编号,初始时由于没有边加入所以都是-1
4、next[]数组存储编号为i的边下一条边的编号

由上面的实现方法可知,一般u、v、w、next数组的数组大小定为m+1(m为边个数),first数组的数组大小定为n+1(n为顶点个数),当然也可以统一设置为较大的空间

存储过程:
1、首先录入a b c(顶点a->顶点b的权值为c),分别记录在u、v、w数组,假设abc编号为第i条边
2、如果first数组下标为u[i]的数值为-1,那么就在first[u[i]]存储第i条边;
如果first数组下标为u[i]的数值不为-1,那么现在next数组下标为i(当前边)存储first[u[i]](上一条边),之后first数组下标为u[i]的数值变为i(变为当前边)(此处较难理解)

假设有4个顶点、5条边,边的数据如下
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7

代码如下

#include <stdio.h>
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值