图的存储——链式前向星

第一次听讲道理没听懂是啥玩意
然后觉得可能用处不大就没管
当我学Tarjan的时候,我哭了…

链式前向星

定义

前向星是一种特殊的边集数组。将边集数组中的每条边按照起点排序,起点相同按终点排序。记录下某个点为起点的所有边的数组中的起始位置和存储长度。

优势

可以在O(1)的时间找到以i为起点的第一条边,以O(len[i])的时间找到以i为起点的所有边的长度。但对于所有边按起点排序,以快排计算,至少为O(eloge)的时间复杂度。

如果将链表引入前向星,将会得到大幅优化。

代码实现

1.边集数组:

struct edge{

int e,n,w;

}edges[MAXN];

e表示起点,n来存同起点的下一条边的位置,w是权重啦。maxn…最大边数。如果顶点数为n,那么MAXN=n*(n-1)/2

2.haad数组

顾名思义,存以i为起点的第一条边出边的存储位置。也就是以i为起点的所有出边的存储的起始位置

3.idx

记录边数的int变量…没啥说的…

加边函数

const int MAXN=101;//最大的顶点个数
struct edge{
    int e,n,w;
}edges[MAXN*(MAXN-1)];
int head[MAXN],idx=0;
void addedges(int u,int v,int w){
    edges[++idx].e=v;
    edges[idx].w=w;
    edges[idx].n=head[u];
    head[u]=idx;
} 
原文地址:https://www.cnblogs.com/Uninstalllingyi/p/10466189.html