链式前向星

链式前向星实质为数组模拟链表。

不妨设有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开始,初始值则可以改动。

posted @ 2020-08-07 17:50  Konnyaku  阅读(140)  评论(0编辑  收藏  举报