图的存储

本文介绍了图的两种常见表示方法——邻接矩阵和邻接表。邻接矩阵通过二维数组记录图中顶点之间的连接关系,适合于稠密图。邻接表则以链表形式存储每个顶点的出边,适用于稀疏图。对于带权图,邻接矩阵可以直接存储边权,邻接表则可通过结构体存储边的终点和权重。文章还展示了如何使用C++的vector实现邻接表,并演示了添加边的操作。
摘要由CSDN通过智能技术生成

邻接矩阵

设图G(V, E)的顶点标号为0, 1,…, N-1,那么可以令二维数组G[N][N]的两维分别表示图的顶点标号,即如果G[i][j]为1,则说明顶点 i 和顶点 j 之间有边;如果G[i][j]为0,则说明顶点 i 和顶点 j 之间不存在边,而这个二维数组G[][]则被称为邻接矩阵。
如果存在边权,则可以令G[i][j]存放边权,对不存在的边可以设边权为0、-1或是一个很大的数。
在这里插入图片描述

邻接表

设图G(V, E)的顶点标号为0, 1,…, N-1,每个顶点都可能有若干条出边,如果把同一个顶点的所有出边放在一个列表中,那么N个顶点就会有N个列表(没有出边,则对应空表)。这个N个列表被称为图G的邻接表,记为Adj[N],其中Adj[i]存放顶点i的所有出边组成的列表,这样Adj[0], Adj[1],…,Adj[N-1]就分别都是一个列表。
在这里插入图片描述
由于列表可以用链表实现,则其中Adj[0]用链表连接了两个结点,每个结点存放一条边的信息(括号外的数字是边的终点编号,括号内的数字是边权),于是0号顶点有两条出边:一条的终点为1号顶点(边权为2);另一条边的终点为4号顶点(边权为1)。而对Adj[4],表示4号顶点的三条出边信息,其终点分别是0号顶点、1号顶点、3号顶点,边权分别为1、2、1。

用vector来实现邻接表
在这里插入图片描述
邻接表只存放每条边的终点编号。

vector<int> Adj[N]; //N表示顶点个数

添加一条从1号顶点到达3号顶点的有向边,在Adj[1]中添加终点编号3(如果是无向边,就再添加一条从3号顶点到达1号顶点的有向边)。

Adj[1].push_back(3);

存放边的终点编号和边权

struct Node
{
	int v; //边的终点编号
	int w; //边权
};

vector邻接表中的元素类型就是Node型

vector<Node> Adj[N];

添加从1号到达3号顶点的有向边,边权为4,就可以定义一个Node型的临时变量temp,令temp.v=3、temp.w=4,然后把temp加入到Adj[1]中即可

Node temp;
temp.v = 3;
temp.w = 4;
Adj[1].push_back(temp);

定义结构体Node的构造函数

stuct Node
{
	int v, w;
	Node(int _v, int _w):v(_v),w(_w){} //构造函数
};

这样就不能定义临时变量来实现加边操作

Adj[1].push_back(Node(3, 4));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阳光开朗男孩

你的鼓励是我最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值