图的存储结构
图的存储结构
邻接矩阵——表示顶点间相连关系的矩阵
设图G有n (n≥1) 个顶点,则邻接矩阵是一个n阶方阵。当矩阵中的 [i,j] !=0(下标从1开始) ,代表其对应的第i个顶点与第j个顶点是连接的。
特点:
无向图的邻接矩阵是对称矩阵,n个顶点的无向图需要n*(n+1)/2个空间大小
有向图的邻接矩阵不一定对称,n个顶点的有向图需要n²的存储空间
无向图中第i行的非零元素的个数为顶点Vi的度
有向图中第i行的非零元素的个数为顶点 Vi 的出度,第i列的非零元素的个数为顶点 Vi 的入度
邻接表
为图G中的每一个顶点建立一个单链表,每条链表的结点元素为与该顶点连接的顶点。
特点
无向图顶点 Vi 的度为第 i 个单链表中的结点数
无向图中顶点 Vi 的出度为第 i 个单链表中的结点个数顶点 Vi 的入度为全部单链表中连接点域值是 i 的结点个数
逆邻接表:有向图中对每个结点建立以 Vi 为头的弧的单链表
链式前向星
首先,链式前向星需要一个结构体:
1 2 3 4 5 | struct Edge //存边 { int v, w, nxt; }edge[m]; v,w分别是终点,边权 |
若这条边的起点为u,则nxt是u的上一条出边的编号
还需要一个数组:
1 2 | int head[n]; head[u]表示目前u的最后一条出边 |
还需要一个变量
1 2 | int cnt; 表示边的数量 |
那加边就可以写出来了
1 2 3 4 5 6 7 8 | void add( int u, int v, int w) { ++cnt; edge[cnt].v = v; //终点 edge[cnt].w = w; //边权 edge[cnt].nxt = head[u]; //见下 head[u] = cnt; } |
函数的后两行对我来说比较难理解
下面说的“边”指的是u的出边
最新的边(新加的边)的上一条边就是之前的最后一条边
最新的边是edge[cnt],最新的边的上一条边是edge[cnt].nxt
之前的最后一条边是head[u],所以edge[cnt].nxt = head[u]
那最后一行就是更新目前最后一条边(即新加的边)的编号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!