邻接表表示树与图

结构体表示边

邻接表可以看作是将多个链表用一个数组串联起来
在使用临界表表示图或是树的时候,可以用串联多个链表的数组表示一个点,用数组某一位置的一条链表表示这个点引出的所有边

int hd[10];
//边的起点作为表头
//hd[i]的值是从点i出发的第一条边的编号
struct directed_edge{
 int val,//边的权值 
  to,//边的终点 
  nxt;//同起点的下一条边的编号 
}edge[100];

有几个值得注意的点:

  1. egde[ i ] 中没有定义serial,其编号就是结构体数组中 i 的值
  2. egde[ i ] 中没有定义start,因为我们已经使用hd表示了每条边的起点
  3. 从结构体的全名中可以看出定义的是一条有向边,如果要定义一条无向边,请交换起点和终点,然后重新定义一条有向边
  4. 由于有向边的插入是从小编号到大编号的,所以这里的下一条边,其实是相同起点引出的前一条边,而第一条边就是最新的一条边

有向边的插入

上面我们已经为有向边的插入开辟了空间,现在来看一下怎么插入一条边

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之间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值