链式前向星是一种非常常见且高效的一种存图方法,在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
", x, End[i], Len[i]);//输出起点,终点,长度
i = Next[i];//将i更新为同i一个起点的上一条边,直到 i == 0(没有上一条边,循环结束)
//若i != 0,则循环继续
}
ps:我算是明白了,每个写题解或者介绍算法的人心里都想着,我已经介绍得这么清楚了,不可能有人还不知道是怎么回事吧。
然后看题解的人永远是一脸懵逼,这都是些啥跟啥啊。
我建议构造一组数据自己手动模拟一下,或者尝试自己给别人讲清楚,尝试教会别人,那么不管别人懂没懂,你自己肯定是不会有问题的了orz【被拖出去打死】