邻接表
一直用vector存图,那就先学习一波邻接表。
带有索引数组的多个数据链表构成的结构集合。
存储数据分为若干类,每一类数据构成一个链表,每一类数据还有一个代表元素,称为表头,所有表头构成一个数组,通过表头定位到一类数据对应的链表。
表头head,head[x]保存从点x发出的边。
ver数组存储的是每条边的终点,是真实的图的信息。
//加入有向边(x,y),权值为z
void add(int x,int y,int z){ ver[++tot]=y; edge[tot]=z;//真实数据 next[tot]=head[x]; head[x]=tot;//在表头x处插入 }
//访问从x出发的所有边
for(int i=head[x];;i=next[i]){ int y=ver[i],z=edge[i]; //找到了一条有向边(x,y),权值为z }
需要维护的数组:head 表头,next维护下一节点的ver数组下标信息,edge维护边权,ver维护该边(x,y)到达的点y
tips:无向图处理:可以把tot初始设为1,将一对成对边(x,y)、(y,x)分别存储在2*k,2*k+1位置上,通过下标i^1直接定位其反向边。