链式前向星实质为数组模拟链表。
不妨设有n个顶点,m条边,首先为每条边编号为0~m-1.
对每个顶点的一条边定义一个三元数组(to,w,next)。其中to为该边的终点,w为该边的权值,next为以该顶点出发的另一条边的编号,那如何从顶点找到对应边的编号呢,这时就引入了head数组,head为以该顶点出发的最后一条边的编号。
void add_edge(int u, int v, int w)//u为起点,v为终点,w为权值 { edge[cnt].to=v; edge[cnt].w=w; edge[cnt].pre=head[u];//记录上一条边的编号 head[u]=cnt;//更新最后一条边的编号 cnt++;//其实加边时为从上往下,遍历时为从下往上 }
遍历时只需要从每一个顶点出发(for从1~n)
再从每一个顶点的head[i]出发搜索出以该顶点出发的所有边。
for(i=1;i<=n;i++){//n为顶点数 for(j=head[i];j!=-1;j=edge[j].next){//next其实就是同一顶点的上一条边 printf("%d %d %d",i,edge[j].to,edge[j].w); //edge数组是存边,head数组是存每个顶点的最后一条边,head相当于为edge提供了由头,从顶点到边的转换 } }
至于初始问题,因为边的编号为0~m-1,所以初始值就不能为0,所以-1;
如果边的编号从1开始,初始值则可以改动。