之前我看了很久都没有搞明白邻接表,现在终于差不多搞懂了,特此记录。
那么,邻接表是什么呢?邻接表嘛,就是邻接的表。
其实邻接表不好理解,主要是开的数组比较多,容易弄混,这一分钟好像弄懂了,下一分钟就不知如何下手了。
那么接下来:
每一个数组的作用
head[点的序号] = 从它出发的最后一次输入的边的编号
from[边的序号] = 边的起点;
to[边的序号] = 边的终点;
nxt[边的序号] = 输入的上一个从这条边的出发点出发的边的编号;
edge[边的序号] = 边的权值
ATTENTION!
next
是保留字!- 当然也可以使用结构体。
- 其中除了
head[]
,数组的下标全部都是边而不是点! from[]
和to[]
分别是起点和终点(经常可以不用from[]
);- 有的书上的
ver[]
(如《算法竞赛进阶指南》)就是这里的to[]。
add()函数
使用邻接表存图的时候,用到的add()
函数:
void add(int x, int y, int z) {
to[++tot] = y, edge[tot] = z; //edge为边的权值,可视情况而用
nxt[tot] = head[x], head[x] = tot;
}
好好理解一下,反正我一开始就是卡在“每一个数组的作用”这里。