预备知识:
邻接表的概述
邻接表可以看做是多个单链表的组合
因为每个单链表都需要存储头结点的下标,所以使用数组h
数组e、数组ne、变量idx的用途详见文章数组模拟单链表
邻接表的应用——图的存储
邻接表常用于存储稀疏图。
为了存储图,为图的每个节点分别建立一个单链表,
单链表中的每个图节点即为该图节点可直接到达的图节点。
x号图节点的单链表的头结点的下标为h[x],
由下标可以从数组e中得到当前单链表节点存储的图节点编号。
核心代码
int h[N],e[N],ne[N],idx; // 用于邻接表
int d[N],q[N]; // 用于宽搜bfs
void init() // 邻接表的初始化
{
memset(h, -1, sizeof h);
}
void add(int a,int b) // 在邻接表中添加由a向b的边
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx;
idx ++ ;
}
int bfs() // 图的宽搜
{
int hh = 0, tt = 0;
q[0] = 1;
memset(d, -1, sizeof d);
d[1] = 0;
while(hh <= tt)
{
int t = q[hh ++];
for(int i=h[t]; i!=-1; i=ne[i])
{
int j = e[i]; // 得到当前单链表节点存储的图节点编号j
if(d[j] == -1) // 在图中,编号为j的节点曾经未被搜过
{
d[j] = d[t] + 1;
q[++ tt] = j;
}
}
}
return d[n];
}
例题
图文对照