链式向前星(超超超简单版)

最近在学图论的相关算法,在写到dijkstra的堆优化时候使用unordered_map储存邻接表出了一些问题,然后去看dalao们的题解发现,许多dalao都用了链式向前星储存邻接表,学了一下发个博客加深印象...........

个人理解(未必正确)
        链式向前星储存邻接表相比链表方便一点(可能时间效率各方面也改善吧..没了解过),它能让我们更快的找到同一个起点所发出的边。初学的时候,对于head,to含义的理解可能会有一些困难,其实head、next和to就是为了方便我们找到同一个点发出的不同边,以及他们到达的点(划重点!)

写法模板

        我们先定义边的结构体:
        next的含义:与边edge[i]同起点的上一条边的编号
        to的含义:边edge[i]的终点
        value的含义:边edge[i]的权值

struct Edge{
    int next;
    int to;
    int value;
}edge[m];

        再定义head[m](head[i]的含义:以i为起点的储存的最后一条边的编号)

        相信我这么解释head[i]的含义,你可能听起来有点懵13(没关系,我第一次看见也是),接着往下看

int head[m]

 举例说明

假设我们现在给定4个顶点,6条边的输入数据:

4 6
1 2 2
2 3 2
1 4 1
1 3 5
3 2 3
4 3 1

根据链式向前星,我们可以画出这样一个草图:

方框中表示的是点的编号,'—>'上标注的是边的编号(不是权值!)

现在我们可以开始更新向前星定义中变量的值:

  • 1 2 2:edge[0].to = 2 , edge[0].next = -1 , edge[0].value = 2 , head[1] = 0;
  • 2 3 2:  edge[1].to = 3 , edge[1].next = -1 , edge[1].value = 2 , head[2] = 1;
  • 1 4 1:  edge[2].to = 4 , edge[2].next = 0 , edge[2].value = 1 , head[1] = 2 ;
  • .................
  1. 问:当输入为 1 2 2时,为什么edge[0].next = -1?//  输入为 1 4 1时,为什么edge[2].next=0?
    答:因为并不存在与边edge[0]同起点的边  //  因为与边edge[2]同起点的上一条边的编号               为0
  2. 问:当输入为 1 2 2时,为什么head[1] = 0?//  输入为 1 4 1时,为什么head[1] = 2?
    答:输入为1 2 2时,以1为起点的最后储存的一条边的编号为0;而当输入为 1 4 1时,以1为起点的最后储存的一条边的编号变为2(即为edge[2])。

tips:我的排版好乱.............

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值