链式向前星(数组模拟邻接表)

   有关树的经常需要存图,vector数组比较方便,不过有些题卡stl,就很容易T。所以链式向前星就非常重要了。

   这几天能不用链式向前星就不用,因为不会用...这当然是不可取的。想起来初中老班的一句话,出来混迟早是要还的,所以问题不解决迟早是要栽坑的。昨天遇见dfs序时不太会模拟,因为对出栈的点的顺序理解的不是很通透,全套板子。一步一步稳着来,zkw冲呀

 

含义: 

      链式向前星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并用head[ ]记录下以某个点为起点的所有边在数组中的起始位置。换句话来理解它其实就是有n链表,每条链表存的是所有相同结点的边

       edge[i].to:第i条边的终点,即这条边指向哪个点      

       edge[i].nxt:与i同起点的下一条边的存储位置

       edge[i].val:边权

       head[i]:以第i为初始结点的边的序号,其实在以i为起点的所有边的最后输入的那个编号   

理解:

  

用图表示:

   

 

 板子:

int head[maxn];  //记得初始化为-1
int cnt = 0;
struct node {
    int to;
    int nxt;
    int val;
}edge[maxn];   //若建立双向边的话,maxn需要*2

void add(int a,int b,int val) {
    edge[cnt].to = b; 
    edge[cnt].nxt = head[a];
    edge[cnt].val = val;
    head[a] = cnt++;
}

//遍历起点为x的链表
for(int i = head[x]; i!=-1; i=node[i].nxt) {
    
}

 

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值