【学习】小蒟蒻学了半天不理解的东西——链式向前星
前言
小蒟蒻实在是太菜了,看了好久都没看懂,最后在某dalao的指导下才终于理解了它
关于链式向前星和他的兄弟姐妹
链式向前星等价于邻接表,即用数组模拟邻接表来存图
和它相像的还有前向星和链式前向星,这两个前向星好像跟邻接表有些许的不同 吧 而且用的好像不多?(由于不是重点,有兴趣的话可以自行百度)
小蒟蒻也不知道他们究竟一不一样,有大佬懂的话欢迎指正
毕竟我在某度上搜这三个词出现的搜索结果不一样的说
先上代码
struct node{
int to,w,next; //e[i].to是第i条边指向的那个点
//e[i].next是emmm我也解释不清楚,看图吧
//e[i].w是边权 这里不涉及
}e[200001];
int head[100001],cnt_edge; //head是表头,即最后加入的点
void add(int from,int to,int w){ //加边
e[++cnt].to=to;e[cnt].w=w;e[cnt].next=head[from];head[from]=cnt;
}
memset(head,-1,sizeof(head));
大家肯定都看不懂因为我当时就没看懂
存图当然要画图解释啦
读入一张图
1 4 1 3 3 4 2 3
画出来就是这个样子,红色的数字是读入边的顺序,也就是cnt_edge
下面的图就清晰多了
Q1:为什么head[1]=0,后来head[1]=1呢?
A1:因为第一次加边时,只有-1 <- 4,这时1的head值,即最后面的一条边,就是0,再加一条边后最后面就变成了4 <- 3,所以head[1]就被更新成1了
Q2:edge[0].next为什么是-1?
A2:因为head[]被初始化为-1了
Q3:那为什么edge[1].next=0呢?
A3:
看图中蓝色的线,是不是一目了然,不用解释了吧
结束了
现在再看这段代码是不是清晰多了
struct node{ int to,w,next; //e[i].to是第i条边指向的那个点 //e[i].next是emmm我也解释不清楚,看图吧 //e[i].w是边权 这里不涉及 }e[200001]; int head[100001],cnt_edge; //head是表头,即最后加入的点 void add(int from,int to,int w){ //加边 e[++cnt].to=to;e[cnt].w=w;e[cnt].next=head[from];head[from]=cnt; }
memset(head,-1,sizeof(head));