数据结构与算法之图

什么是图

在前面的文章中, 我们了解了树的概念, 重点是二叉树, 图在拓扑结构上和树有点类似, 但是图不是树.

直观地, 先来看一个图的拓扑结构:

https://s3.ax1x.com/2021/03/09/61qHMV.png

无向图

上述展示的是无向图, 无向图就是没有方向的图, 只要两个结点之间是联通的, 就可以从一个结点到另外一个结点.

我们可以将其理解为简化后的地图, A-G代表的是地点.

一般地, 对图我们有以下的一般性概念:

  • 图的结点叫做顶点;
  • 顶点(结点)之间的连接叫做边;
  • 一个顶点(结点)有多少条边叫做这个顶点(结点)的度;

对应的, 还有有向图, 有向图就是有方向的图, 链接的两个顶点的边有方向, 可以从一个顶点到另外一个顶点, 如果两个顶点互通, 则至少要有两条不同方向的边.

有向图类似于行车单向道.

https://s3.ax1x.com/2021/03/09/61qTx0.png

有向图

有向图的边可能从一个顶点指出, 也可能指向一个顶点, 我们把从顶点指出的边的数量叫做这个顶点的出度, 指向一个顶点的边的数量叫做这个顶点的入度.

类比于地图, 两顶点之间的边不仅可以表示联通关系, 还可以表示距离, 给每条边带上一个"距离"参数(权重), 这样的图叫做带权图:

https://s3.ax1x.com/2021/03/09/61qbrT.png

带权图

图的类比对象

用图这种数据结构可以表示日常生活中的一些常用对象, 这里举一些例子:

  • 地图可以用图表示, 顶点就是地点, 边就是两个地点之间的路径, 边带上权重就可以表示距离;
  • 好友关系也可以用图表示, 顶点就是每个个体, 边表示这两个个体之间是否有联系, 边带上权重可以表示好感度;
  • 编译器也用到了图, C/C++编译时的头文件include就可以用图的顶点表示, 有向边可以表示依赖关系;

邻接表存储法

图如何存储?

很直观的时类似树一样的存储方法, 用链表表示图的拓扑结构. 但是这种方法的问题在于不知道图的每个顶点会有多少条边, 所以不太好定义结构体.

邻接表存储法也是使用链表存储的方法, 它把每个顶点表示为链表的头, 后继结点则是与顶点连接的其他顶点, 如下图表示无向图的邻接表存储法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsUyDPXU-1629955069492)(https://s3.ax1x.com/2021/03/09/61qo2q.png)]

邻接表存储法

1
2
3
4
5
template <typename T>
struct Graph{
    T val;
    vector<Graph<T>*> link;
};

以上, val表示顶点的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值