链式前向星
图的存储一般有三种:邻接矩阵、邻接表、前向星。
若图是稀疏图,边很少,开二维数组很浪费;
若点很多(如10000个点)a[10000][10000]
又会爆.只能用前向星做.
前向星的效率不是很高,优化后为链式前向星,直接介绍链式前向星。
(一)链式前向星
1. 结构
这里用两个东西:
1 结构体数组edge存边,edge[i]表示第i条边,
2 head[i]存以i为起点的第一条边(在edge中的下标)
1 | struct EDGE{ |
2.增边
若以点i为起点的边新增了一条,在edge中的下标为j.
那么edge[j].next=head[i];然后head[i]=j.
即每次新加的边作为第一条边,最后倒序遍历
1 | void Add(int u, int v, int w) { //起点u, 终点v, 权值w |
3. 遍历
遍历以st为起点的边
1 | for(int i=head[st]; i!=0; i=edge[i].next) |
i开始为第一条边,每次指向下一条(以0为结束标志) (若下标从0开始,next应初始化-1)
一个简单的输出有向图熟悉链式前向星:
1 | #include <iostream> |
(二)链式前向星实现SPFA
1 | #include <iostream> |