链式前向星【基础】

链式前向星是一种非常常见且高效的一种存图方法,在LCA/SPFA等算法中很常用,所以我们今天就来学习一下它的使用方法orz

需要申明的数组

End[i]:第i号边指向的点
Len[i]:第i号边的长度
Next[i]:跟第i号边有 相同起点上一条边 的编号
Last[ x ]:以x为起点的 最新 一条边的编号

1.在End[i]、Next[i]和Len[i]中,i表示的是第i号
而在Last[x]中,x表示的是第x号
2.在Next[i]和Last[x]中存的是 的编号,
而在End[i]中存的是 的编号;
3.边的编号由输入顺序决定,点的编号由输入数据决定;
4.此处均以有向图讨论,无向图只需要将一条边拆分成两条有向边来存即可;
5.所有数组的初值均可赋为0;


存图代码

//输入n,下面n行输入三个数字,x,y,z,表示从x到y有一条长度为z的边
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++){
    scanf("%d%d%d", &x, &y, &z);
    End[i] = y;//注意驼峰命名法
    Len[i] = z;
    Next[i] = Last[x];//注意此行与下一行的顺序
    //因为Last[i]存的是以x为起点的上一条最新的边,所以此时以x为起点是上一条边 == 目前的Last[x]
    Last[x] = i;//更新,保证Last[i]始终存的是最新一条边的编号

输出从点x出发的边

    int i = Last[x];//找到最新的一条以x为起点的边
    while(i){//如果有以x为起点的边,则i != 0,则循环继续
    printf("%d %d %d\n", x, End[i], Len[i]);//输出起点,终点,长度
    i = Next[i];//将i更新为同i一个起点的上一条边,直到 i == 0(没有上一条边,循环结束)
    //若i != 0,则循环继续
    }

ps:我算是明白了,每个写题解或者介绍算法的人心里都想着,我已经介绍得这么清楚了,不可能有人还不知道是怎么回事吧。
然后看题解的人永远是一脸懵逼,这都是些啥跟啥啊。
我建议构造一组数据自己手动模拟一下,或者尝试自己给别人讲清楚,尝试教会别人,那么不管别人懂没懂,你自己肯定是不会有问题的了orz【被拖出去打死】

猜你喜欢

转载自www.cnblogs.com/qwqq/p/10530462.html