图论之邻接表的数组实现

虽然邻接矩阵真的很方便,很简单,很利于理解,但却有着一些重大缺陷;

当我们遇到的是一张稀疏图的时候,邻接矩阵就造成严重的空间浪费,更直接一点,就是根本存不下来;

这个时候就不得不考虑其他存图方式了,这个时候另一种流行的存图方式就登场了——邻接表,当然使用vector数组也是一种良好的选择;

邻接表的实现可以通过链表或数组的方式实现,我这里主要讲数组的实现方法;

首先,有三个数组,分别为u[max],v[max],w[max]分别代表着每条边的起点,终点,权重,而下标则代表着边的编号;

然后设立first[max],next[first]这两个数组;

first数组存储的是边的编号,下标代表的是边的起始结点;

next数组存储的是编号为i的前一条边的编号,其中i就是下标;

那么插入一条边的过程就是这样的:

首先将边读入到u,v,w这三个数组中;

然后根据u找到first数组中下标为u的那栏,如果为空,就将边的编号直接加入其中,否则,将这编号放入对应的next数组中,将first数组中存新加入的结点编号;


int n,m;//结点数目,边的数目
int u[1000],v[1000],w[1000];//边的起点,终点,权重
int first[1000],next[1000];
cin>>n>>m;
for(int i=1;i<=n;++i)
{
    first[i]=-1;//将-1作为标志,完成初始化
}
for(int i=1;i<=m;++i)
{
    cin>>u[i]>>v[i]>>w[i];
    next[i]=first[u[i]];
    first[u[i]]=i;
}


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值