一、概要我们在学习图论时,学习了图的记忆结构。 二维阵列邻接矩阵记忆。 他可以表达直觉,快速访问连接两点的边,但只适用于空间大、点少的图。 所以,我们需要能够记忆大型图的东西——链式前方星。
正向星形是一种特殊的边集数组,它按起点从小到大的顺序对边集数组中的每条边进行排序,如果起点相同,则按终点从小到大的顺序进行排序,并记录以某一点为起点的所有边在数组中的起始位置和存储长度。
二、链式前向星的基本原理首先列入下图。
点1是指点2、点3、点4。
链星是以边缘为中心的保存方式,需要利用结构体来划定边缘。 这样可以使图更清晰。
首先,必须创建边缘数组edge[ ]。 一般来说,需要记录各种元素,如下一条边的编号、边到达的点、边的长度等
结构边缘{ int next; //下一边的编号int to; //这一带到达的地点int dis; //这一带的长度}edge[maxm]; 然后添加已知边
int main () {num_edge=0; //定义边数,后面直接scanf('%d%d ',n,m ); //输入点数和边数for(intI=1; i=m; I )//记录边缘数(scanf('%d%d%d )、u、v、d ); //输入权重从哪里来到哪里的add_edge(u,v,d ); //正存图add_edge(v,u,d ); //有向图时,试着添加容易添加的add函数,将图表反向保存}。
从voidadd_edge(intfrom,int to,int dis ) from到to的距离为dis的单向边) { edge [ num _ edge ].next=head [ from ]; edge[num_edge].to=to; //to为edge[num_edge].dis=dis;//将dis设置为head[from]=num_edge; //}过了这一步可能有点迷茫,下面是保存图的模拟:
这边的模拟结束后,得到下图。
突然之间,你可能会被想象成这样:
最后一部分是调用,它根据你的主题决定。 但是,不能离开下一个进程的核心。
for(intI=head[k]; I!=0; i=edge[i].next )