结构体表示边
邻接表可以看作是将多个链表用一个数组串联起来
在使用临界表表示图或是树的时候,可以用串联多个链表的数组表示一个点,用数组某一位置的一条链表表示这个点引出的所有边
int hd[10];
//边的起点作为表头
//hd[i]的值是从点i出发的第一条边的编号
struct directed_edge{
int val,//边的权值
to,//边的终点
nxt;//同起点的下一条边的编号
}edge[100];
有几个值得注意的点:
- egde[ i ] 中没有定义serial,其编号就是结构体数组中 i 的值
- egde[ i ] 中没有定义start,因为我们已经使用hd表示了每条边的起点
- 从结构体的全名中可以看出定义的是一条有向边,如果要定义一条无向边,请交换起点和终点,然后重新定义一条有向边
- 由于有向边的插入是从小编号到大编号的,所以这里的下一条边,其实是相同起点引出的前一条边,而第一条边就是最新的一条边
有向边的插入
上面我们已经为有向边的插入开辟了空间,现在来看一下怎么插入一条边
void add_edge(int f,int t,int w){
tot++;
//这个tot是提前定义好的,表示已定义边的总数
//边的总数加一来开始边的添加
edge[tot].to=t;//赋予新边终点
edge[tot].val=w;//赋予新边边权
edge[tot].nxt=hd[f];
//在这个时刻新的边还没有被包装好送入邻接表当中
//所以hd[f]所表示的“最新的”边还是曾经的最新边
//这条边即将成为正在制作的最新边的下一条边
h[f]=tot;
//制作好的边已通过nxt和子链表链接
//现在将此边与表头连接,也就是更新h[f]的值
}
最后
使用子链表构建邻接表,并熟练地添加边是学习图论(和搜索)的基础,一定要弄懂这些代码的意义,而不是机械地背板子
作为一名蒟蒻,我写的这篇博客可能并没有将邻接表表示图和树的知识都讲全,希望各位大神能够指出这篇博客中的错误和遗漏的部分,帮助我将每一篇博客都写成精品,谢谢!
构建邻接表的过程就是绘图的过程,每一根线条,每一个点,都隐藏在代码行中,线条的长度,方向,点的顺序,都夹在0和1之间