邻接表
作为一名现役Oier在做过无数图论题目和搜索题目之后,可以说是相当熟悉了,但是今天做的一道题,让我对于邻接表表示直接懵逼,原来在跑最短路的时候还是明白每个数组各自的作用的,然而一旦在其它题目中遇到就不会了,所以今天特意复习,并决定好好整理一下,以后别再懵逼了…
附上神犇ahalei的Blog:http://blog.csdn.net/ahalei/article/details/23356781
(里面对于邻接表的解释还是很透彻的)
邻接表
但什么是邻接表呢(・ω・。)ʃฺ??
众所周知,邻接矩阵是用矩阵实现存图的一类数据结构
而邻接矩阵,则是用链表(好多个)来实现存图的一类数据结构
但是手打链表mdzz,指针都不怎么用啊(一直都是在用数组下标模拟)
所以说对于邻接表我们也可以用数组来模拟实现
代码(结构体封装)
int head[maxn];
struct node{
int from,to,cost,next;
}e[maxn << 1];//无向图(maxn << 1)
初始化
for(int i = 1;i <=n;i++){
//n由题意而来
head[i] = -1;
}
//当然也可以一步写成memset(head,-1,sizeof(head)),但是实测比for一遍更慢
这里,head 数组存的是我们建图时,某个点所存的最后一条边的编号
例如我们存入点1的一条边,这条边是总第5条边,则我们将head[1]赋值为5,但是之前我们1号点若已经记录过一条边,如果我们这时修改head[1]那么之前那条边不就没了吗,但是显然我们不能让这条边消失,而是应该想办法让它在head修改之后依然能够被找到
这时候别忘了