邻接表

一直用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直接定位其反向边。

 

posted @ 2019-07-22 15:05  liulex  阅读(273)  评论(0编辑  收藏  举报