图的存储(精炼版)

刚看完图的存储

写博客练练手,巩固一下刚学的知识qwq。。

该博客特点:讲述了不同存储的特点或者优缺点,更加直白。

前排须知:

所有有向边为从u到v,权用q表示

以此明确了u,v,q的定义。

图的存储其实有四个方法,其中前两者好理解,后面跟着牵扯到stl的vector所以需要前置知识,但也运用更加广泛,分别如下:

1.直接存边

一维数组+结构体存边,a[i].u,a[i].v,a[i].q

缺点:不能存重边。

2.邻边矩阵

二维数组存(指向的)边,a[u][v]=q/0

缺点:因为是二维数组,空间开太大容易爆,不能存重边。

优点:查询O(1)【这个挺重要的,查询会卡就用这个存储方式】

3.邻接表

vector<int> a[n] 存边(误区:这是类似二维数组,因为vector本身就有了一维)

把边放到vector里面:a[u].push_back(v);

定位:存各种图都很适合,除非有特殊需求(如需要快速查询一条边是否存在,且点数较少,可以使用邻接矩阵

4.链式前向星

邻接表的基础上加上类似链表的功能

这个前向星比较复杂,目前我也不是完全掌握,就不误导读者了,读者可以另找资料学习。

// C++ Version
// head[u] 和 cnt 的初始值都为 -1
void add(int u, int v) {
  nxt[++cnt] = head[u];  // 当前边的后继
  head[u] = cnt;         // 起点 u 的第一条边
  to[cnt] = v;           // 当前边的终点
}

// 遍历 u 的出边
for (int i = head[u]; ~i; i = nxt[i]) {  // ~i 表示 i != -1
  int v = to[i];
}

定位:存各种图都很适合,属于中庸的储存方式。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

繁水682

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

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

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

打赏作者

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

抵扣说明:

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

余额充值