***************装载请申明出处**************
这个文档是别人问我链式前向星的时候匆忙写的,如果还有什么讲的不清楚的地方欢迎大家提出来
链式前向星初始数据:
Struct edges{
int to;
Int nextEdge;
Int weight;
}edge[];//多少条边,无向图要乘以二,同时记录两个方向因为起点不同
Int M = 0;
Int head[];//多少个节点
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为起点的边就能全部遍历一遍了.之后就可以按照这个思路自己推算一遍了