邻接表(图的表示)
表示图的一种简单的方法是使用一个二维数组,成为邻接矩阵表示法,对于每条边(u,v),我们置A[u][v] = 1,否则,数组元素就是0。如果边有一个权,那么我们可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。邻接矩阵的表示法无论是在理解还是写法上都很简单,但是空间需求为O(|V|^2),如果图的边不是很多,那么这种表示方法的代价就太大。一般的,对于稠密图,我们使用邻接矩阵表示法,而更为通用的则是用邻接表表示,邻接表的空间需求仅为O(|E|+|V|).
对于每一个点,把与之相邻的点记录下来,如图9-2所示,编号1所对应的2、4、3(顺序不唯一)即为其相邻的点。
代码实现
struct Edge{
int u,v,w,next;
};
int head[MAX];
memset(head,-1,sizeof(head));
for (int i = 0; i < 2*M; i+=2)
{
scanf("%d%d%d",&u,&v,&w);
edge[i].u = u;
edge[i].v = v;
edge[i].w = w;
edge[i].next = head[u];
head[u] = i;
edge[i+1].u = v;
edge[i+1].v = u;
edge[i+1].w = w;
edge[i+1].next = head[v];
head[v] = i+1;
}
建立结构体,存取点的信息,u为当前点,v为与u相邻的点,w为u,v之间边的权值;
head[]数组初始化为-1,head[x],x的含义表示的就是点,例如head[1]就是1这个点,head[1]的值则记录下关于1这个点的邻接表的位置,类似于链表的头节点。
另外,代码中给出的是无向图邻接表的建立。
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆