数组模拟链表或者所谓的邻接表,实际上都是静态链表,以数组下标模拟模拟内存地址,使得可以一开始就给数组分配好连续的一大片空间,而使用中的“内存分配”实际上就是变成了简单的idx++
比赛中使用静态链表代替指针型链可以减少内存分配带来的时间消耗,并且使用方式也比较简单
比赛中的单链表或者邻接表也可以用vector实现,达到动态内存分配的效果,其实就是类似于指针链表,不过使用方式也比较简单直观
比如图论模型:节点编号从1to100000,需要用邻接表
邻接表 可以用来存储图和树
数组模拟可以达到一个比使用容器更高的效率
数组模拟单链表
// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点
int head, e[N], ne[N], idx;
// 初始化
void init()
{
head = -1;
idx = 0;
}
// 在链表头插入一个数a
void insert(int a)
{
e[idx] = a, ne[idx] = head, head = idx ++ ;
}
// 将头结点删除,需要保证头结点存在
void remove()
{
head = ne[head];
}
数组模拟邻接表
// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点
int h[N], e[N], ne[N], idx;
// 添加一条边a->b
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
// 初始化
idx = 0;
memset(h, -1, sizeof h);