在Dijkstra算法中,当图为稠密图时,可以用邻接矩阵来存图,好写但是效率低,当图为稀疏图时,
可以用邻接表来存图,效率高。
以下记录自己对邻接表的理解:
邻接表存图,又叫链式存储法,利用数组和链表来实现存储,我们可以直接用数组来模拟单链表
邻接表的结构体(一般方法):
struct Edge{
int to; //终点
int w; //边的权重
int next; //起点
}edge[N];
head[顶点的个数]
edge为图的边集,我们把图中的每一条边进行编号,to指向这条边的终点,w存放边的长度,
edge[x].next表示边x的下一条边的编号,head[x]表示以x为起点的最后一条边
构建图的函数:
//idx表示为边的编号,从0开始
int idx = 0;
//a为某条边的起点,b为该条边的长度,c为该条边的长度
void add(int a,int b,int c)
{
edge[idx].to = b;
edge[idx].w = c;
edge[idx].next = head[a];
head[a] = idx++;
}
如此,我们就可以构建一个图,下面为数组模拟的邻接表的加边函数:
void add(int a,int b,int c)
{
//e[x]存放边x的终点
e[idx] = b,w[idx] = c,ne[idx] = head[a],head[a] = idx++;
}
网友评论