深入理解链式前向星

***************装载请申明出处**************


这个文档是别人问我链式前向星的时候匆忙写的,如果还有什么讲的不清楚的地方欢迎大家提出来

链式前向星初始数据:

Struct edges{

int to;

Int nextEdge;

Int weight;

}edge[];//多少条边,无向图要乘以二,同时记录两个方向因为起点不同

Int M = 0;

Int head[];//多少个节点

扫描二维码关注公众号,回复: 2439605 查看本文章

Void addEdge(int from,int to,int weight){//起点,终点,权重

Edge[M]. to = to;

Edge[M].nextEdge = head[from];

Edge[M].weight = weight;

Head[from] = M++;

}



首先要理解head[from]的一个概念,首先注意到M这个变量,每记录进来一条边然后这个变量就+1,那么这个M就是用来记录边的标号的,

那么head[from]是什么?

我们知道from是这条边的起点,注意到这个M是这条边的编号,那么head[from]就好理解了,

就是head[from]是以from为起点的一条边它的值就是这条边的编号.

那它的值是什么呢?

注意到开始的时候我们全部head数组全部初始化为-1,那么开始就是没有共同边的意思,

这个时候我们拿一组数据过来实验一下

1 2

1 3

开始的时候是没有的,当输入1 2这组数据的时候

Edge[0].to = 2,edge[0].nextEdge = head[1] = -1; head[1] = 0; M++  M=1;

再次加入1 3这组数据

Edge[1].to = 3,edge[1].nextEdge = head[1] = 0; head[1] = M++;此时head[1]=1;

如果之后还有以1为起点的边,然后head[1]数组就会一直更新下去,它的值为最后一次更新head[1]的那一条边,

理解完head数组之后.nextEdge的值为什么呢?

注意到每一次都有.nextEdge = head[from],head[from]为最后一次更新head[from]的一条以from为起点的边,

所以.nextEdge实际上就是指向上一条以from为起点的边,

这就就和链表一样,head[from]为头节点,根据这个值可以找到一条以from为起点的边,

然后又可以通过那条边的nextEdge找到上一个以from为起点的边,

就这样一直找,from为起点的边就能全部遍历一遍了.之后就可以按照这个思路自己推算一遍了

猜你喜欢

转载自blog.csdn.net/lala__lailai/article/details/79269509