• 链式前向星


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

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

  • 相关阅读:
    [HNOI2019]JOJO
    [TJOI2019]唱、跳、rap和篮球
    [ZJOI2019]开关
    jzoj5746
    [JSOI2019]神经网络(指数生成函数)
    [TJOI2019]甲苯先生的线段树
    [JSOI2019]节日庆典
    XSY1519
    XSY1528
    springboot actuator监控笔记
  • 原文地址:https://www.cnblogs.com/Fish-/p/13454285.html
Copyright © 2020-2023  润新知